💾arr.containsSubarray()

💡 祕技:下面的 valueIsInArraySequentially 用了一個內含參數 iclosure,讓每次測試「一個值是否在陣列中」,都從新的位置開始搜尋:

// ⭐️ 注意:函數的參數都是變數(var)
// intial value of `i` = 0   ̄ ̄ ̄ ̄ ̄ ̄⤵︎
(i => v => i = this.indexOf(v, i) + 1)(0)

簡直是太聰明了👍

// 🔸 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