💾arr.containsSubarray()
💡 祕技:下面的 valueIsInArraySequentially
用了一個內含參數 i
的 closure,讓每次測試「一個值是否在陣列中」,都從新的位置開始搜尋:
// ⭐️ 注意:函數的參數都是變數(var)
// intial value of `i` = 0  ̄ ̄ ̄ ̄ ̄ ̄⤵︎
(i => v => i = this.indexOf(v, i) + 1)(0)
簡直是太聰明了👍
array.containsSubarray()
, this === array
// 🔸 arr.containsSubarray()
Array.prototype.containsSubarray = function(subarray, orderIsRelevant=false) {
// ⭐ closure with internal parameter `i`
const valueIsInArraySequentially = (i => v => i = this.indexOf(v, i) + 1)(0);
const valueIsInArray = (v => this.includes(v));
const valuePassedTest = orderIsRelevant ? valueIsInArraySequentially : valueIsInArray;
return subarray.every(valuePassedTest);
};
valueIsInArraySequentially is equivalent to:
// closure (with internal variable `startFromIndex`)
const valueInArraySequentially = (()=>{
// internal variable in clusure
let startFromIndex = 0;
// when calling `array.containsSubarray()`, `this === array`
return (value) => startFromIndex = this.indexOf(value, startFromIndex) + 1;
})();
Last updated
Was this helpful?