我正在撰寫一個函式,它將一個陣列 ( arr1)作為第一個引數,然后是 N 個引數 ( arr2),通過它arr2從陣列 ( arr1) 中洗掉 N 個引數( )。該函式似乎正在完成這項作業,除非它在 ??if 陳述句變為 true 時立即停止。我知道這一點,因為如果我洗掉 if 陳述句,回圈將迭代到最后。任何想法我做錯了什么?
所以回傳的陣列下面應該是['A','B','E']。
const removeFromArray = function(arr1, arr2) {
let arr_new = arr1;
first_loop:
for (const [y, elem] of arr1.entries()) {
for (let i=1; i<arguments.length; i ) {
if ((elem === arguments[i])) {
arr_new.splice(y);
}
}
}
return arr_new;
}
alert(removeFromArray(['A', 'B', 'C', 'D','E'],'C','D'));
uj5u.com熱心網友回復:
splice修改原始陣列,以便在呼叫它時。它只是洗掉所有元素,y直到結束arr_new并arr_new參考arr1.
const foo = [1, 2, 3, 4];
foo.splice(2);
console.log(foo); // [1, 2]
arr1.entries()是一個迭代器,它繼續在arr1內部跟蹤,所以當你修改arr1它時它也會修改entries,所以這就是你的回圈停止的原因 -拼接后沒有元素
要解決此問題,您可以修改代碼
if ((elem === arguments[i])) {
arr_new.splice(y, /*?? remove only one element*/1);
}
?? 上面的 Ps 解決方案仍然存在索引問題,因為您修改了原始陣列并在該索引上進行中繼。這會導致不正確的整體結果
這是從陣列中洗掉的正確解決方案,無需修改且具有更好的復雜度 O(n)
const removeFromArray = function(arr1, ...arr2) {
const exclude = arr2.reduce((acc, curr) => {
acc.add(curr);
return acc;
}, new Set());
return arr1.filter((it) => {
return !exclude.has(it)
});
}
uj5u.com熱心網友回復:
這是您要完成的任務的另一種選擇。雖然箭頭函式沒有arguments,但您仍然可以通過rest parameters. 然后你可以只使用過濾器
const removeFromArray = (...args) => {
let arr1 = args[0], arr2 = args.slice(1)
return arr1.filter(a => arr2.indexOf(a) === -1)
}
console.log(removeFromArray(['A', 'B', 'C', 'D', 'E'], 'C', 'D'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406967.html
標籤:
