2017-08-27 42 views
1

我有一個包含一些單個項目和某些陣列的陣列:函數從陣列內除去單品或陣列 - 的JavaScript

var groceries = ["toothpaste", ["plums", "peaches", "pineapples"], ["carrots", "corn", "green beans"], "orange juice", ["chocolate", "ice cream"], "paper towels", "fish"]; 

我想要寫的函數,以除去一些這些項目或陣列的當被調用時。

對於單品,我寫了這個功能:

function removeItems(arr, item) { 
    for (var i = 0; i < item.length; i++) { 
    var index = arr.indexOf(item[i]); 
    if (index > -1) { 
     arr.splice(index, 1); 
    } 
    } 
}; 

於是我可以打電話:

removeItems(groceries, ["fish", "orange juice"]); 

而這個工程完全按照我想讓它。然而,我無法弄清楚如何讓這個函數能夠從更大的數組中移除數組(例如[「巧克力」,「冰淇淋」))。我會怎麼做呢?

+0

如果我只是想刪除「巧克力」,我會只刪除巧克力或陣列[「巧克力」,「冰淇淋」] – marvel308

+0

我永遠不想刪除陣列中的部分陣列。只能刪除單個項目或整個陣列。那有意義嗎?所以在你的例子中,[「巧克力」,「冰淇淋」]。 – sprucegoose

回答

4

使用Array#reduce創建密鑰字典。如果該項目是一個數組,則加入所有值以創建密鑰。之後通過生成相同的密鑰來篩選所有項目,並根據字典進行檢查。

注 - Array#過濾器會創建一個新數組,並且不會更改原始數組。

var groceries = ["toothpaste", ["plums", "peaches", "pineapples"], ["carrots", "corn", "green beans"], "orange juice", ["chocolate", "ice cream"], "paper towels", "fish"]; 
 

 
function removeItems(arr, toRemove) { 
 
    function createKey(item) { 
 
    return Array.isArray(item) ? item.join('-') : item; 
 
    } 
 

 
    var removeDict = toRemove.reduce(function(d, item) { 
 
    var key = createKey(item); 
 
    
 
    d[key] = true; 
 
    
 
    return d; 
 
    }, {}); 
 

 
    return arr.filter(function(item) { 
 
    var key = createKey(item); 
 
    
 
    return !removeDict[key]; 
 
    }); 
 
} 
 

 
var result = removeItems(groceries, ["fish", "orange juice", ["chocolate", "ice cream"]]); 
 

 
console.log(result);

+0

這是完美的。謝謝你的解釋,真的很有幫助。 – sprucegoose

+0

@sprucegoose - welcome :) –

+0

爲什麼不使用'JSON.stringify'而不是'createKey'?請參閱[我的回答](https://stackoverflow.com/a/45902961/783743)。 –

0

在像從主題刪除元素的問題,我傾向於從使用功能陣列方法敬而遠之,因爲他們會根據初始項目,即使你開始刪除的項目數迭代。所以我的解決方案將是相當必要的。

function remover(itemToDelete, items){ 
 
    var i  = 0, 
 
     check = false; 
 
    
 
    for (var item of items){ 
 
    check = Array.isArray(item) ? item.includes(itemToDelete) 
 
           : item === itemToDelete; 
 
    check ? items.splice(i,1) 
 
      : i++; 
 
    } 
 
    return items; 
 
} 
 

 
var groceries = ["toothpaste", ["plums", "peaches", "pineapples"], ["carrots", "corn", "green beans"], "orange juice", ["chocolate", "ice cream"], "paper towels", "fish"]; 
 

 
console.log(remover("chocolate", groceries)); 
 
console.log(remover("fish", groceries));

0

這是我會怎麼做:

const groceries = [ 
 
    "toothpaste", 
 
    ["plums", "peaches", "pineapples"], 
 
    ["carrots", "corn", "green beans"], 
 
    "orange juice", 
 
    ["chocolate", "ice cream"], 
 
    "paper towels", 
 
    "fish" 
 
]; 
 

 
const equals = (x, y) => JSON.stringify(x) === JSON.stringify(y); 
 

 
const removeItems = (xs, ys) => xs.filter(x => !ys.some(y => equals(x, y))); 
 

 
const result = removeItems(groceries, [ 
 
    "fish", 
 
    "orange juice", 
 
    ["chocolate", "ice cream"] 
 
]); 
 

 
console.log(result);

首先,我們定義它的意思爲兩個值相等。接下來,我們使用這個值相等來定義removeItems。我們說保留所有那些不等於yx