[英]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.