簡體   English   中英

在每個第 n 個索引處連接兩個相鄰數組元素的最佳方法

[英]Best way to join two adjacent array elements at each nth index

假設以下數組示例:

const arr = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana']

我如何將其轉換為如下所示:

const result = ['mango apple', 'kiwi', 'melon orange', 'banana']

我試過 foo 循環,但我不確定 if 條件下的算法,或者它是否是最好的方法,或者 reduce 更好?

 const arr = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana'] let n = [] for (let i = 0; i < arr.length; i++ ) { //Something like simply: i % 2 == 0 //Is obviously not good enough if (/* What here?*/) { n.push(arr[i] + ' ' + arr[i+1]) } else { n.push(arr[i]) } }

您可以為此使用模數( % ),這是一個示例:

 var arr = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana']; var result = []; for (let i = 0; i < arr.length; i++) { if (i % 3 == 0 && i + 1 < arr.length) { result.push(`${arr[i]} ${arr[i + 1]}`); i++; } else { result.push(arr[i]); } } console.log(result);

這樣做的一種方法是這樣的:

 const arr = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana', 1, 2 ,3, 4, 5, 6] let n = [] for (let i = 0; i < arr.length; i+=3 ) { n.push(arr[i] + ' ' + arr[i+1]); n.push(arr[i+2]); } console.log(n); // output // ["mango apple", "kiwi", "melon orange", "banana", "1 2", 3, "4 5", 6]

編輯:根據 Shiva 的評論,我修改了代碼以處理索引值

const arr = ['mango', 'apple', 'kiwi', 'melon']
let n = []
for (let i = 0; i < arr.length; i+=3 ) {
    if(arr[i] === undefined) {
        break;
    }

    let first = arr[i];
    if(arr[i+1] !== undefined) {
        first+= ' ' + arr[i+1];
    }
    n.push(first);
    if(arr[i+2] !== undefined) {
        n.push(arr[i+2]);
    }
}
console.log(n);
// output
// ["mango apple", "kiwi", "melon"]

您可以采用offset來獲取實際索引i + offset並迭代虛擬索引i以完成檢查。

 var array = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana'], n = 2, offset = 0, result = []; for (let i = 0; i + offset < array.length; i++) { result.push(i % n == 0 ? array[i + offset] + ' ' + array[i + 1 + offset++] : array[i + offset] ); } console.log(result);

一種具有生成器功能的方法。

 function* getNTh(array, n) { var i = 0, offset = 0; while (i + offset < array.length) { yield i % n == 0 ? array[i + offset] + ' ' + array[i + 1 + offset++] : array[i + offset]; i++; } } console.log([...getNTh(['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana'], 2)]); console.log([...getNTh(['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana'], 3)]);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

我是重用代碼的忠實粉絲。 IOW:我是一個懶惰的程序員。 :)

因此,從我可以收集到的 OP 確實是在模式迭代器之后。 因為這樣的事情可能對未來有用,所以我會嘗試將其概括為一個函數。

考慮到這一點,我非常喜歡稱為迭代器和生成器的新 Javascript 功能。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators並且這個問題似乎很適合這里的東西,可以一次又一次地重復使用。

附: 即使您想針對還沒有生成器的瀏覽器,也要避免痛苦並讓您的 Javscript 轉譯。 大多數現代瀏覽器也已經有了很好的支持 -> https://caniuse.com/#feat=es6-generators

下面是一個例子,你可以看到改變模式是多么容易,而不必擔心模數和步進等。

 function *patternIter(pattern, len) { let p = 0, ps = pattern[p], c; for (l = 0; l < len; l += 1) { if (!c) c = {offset: l, size: 0}; c.size += 1; if (c.size === ps) { yield c; c = undefined; p += 1; ps = pattern[p % pattern.length]; } } if (c) yield c; } const arr = ['mango', 'apple', 'kiwi', 'melon', 'orange', 'banana'] function showPattern(p) { console.log('Pattern ' + p.join(", ")); console.log( [...patternIter(p, arr.length)] .map(m => arr.slice(m.offset, m.offset + m.size) .join(" ")).join(", ") ); } showPattern([1, 2]); showPattern([3, 2, 1]); showPattern([1, 3, 2]); showPattern([3, 1]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM