2017-08-27 44 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