我对JS数组有疑问。
示例:
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
我们有一个主数组fullArr
和一个部分数组partarr
。我想创建一个函数/过滤器,它在fullArr
而不是partArr
中查找现有项目。
在上面的示例中,newArr
必须等于[1,4]。
我尝试过做这样的事情,但是效果不好。
for (var k in fullArray) { // [1,2,3,4]
for (var j in selectedArray) { // [1,4]
if (fullArray[k] == selectedArray[j]) {
newArray.splice(selectedArray[j] - 1, 1); // must be [2,3]
break;
}
}
}
制作此产品的好方法是什么?感谢。
答案 0 :(得分:5)
这是一个
var newArr = fullArr.filter(function(f) { // The filter() method creates a new array with all elements that pass the test implemented by the provided function.
return partArr.indexOf(f) == -1; // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.
})
给女孩留下深刻印象,你也可以
var newArr = fullArr.filter(function(f) {
return !~partArr.indexOf(f);
})
答案 1 :(得分:2)
以下是您要求的代码。
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
for(var i=0;i<fullArr.length;i++){
if(partArr.indexOf(fullArr[i]) == -1)
newArr.push(fullArr[i]);
};
这是工作Link
希望它有效:)
答案 2 :(得分:1)
您可以使用适用于数组的filter()
函数:
var newArr = fullArr.filter(function(val, i, arr) {
return partArr.indexOf(val) === -1;
});
这将返回一个新数组,其中包含返回true
的每次迭代的值。
如果您将来需要在对象上执行此操作,最好的方法是首先将对象键转换为数组,然后运行过滤器:
Object.keys(myObj).function(val, i, arr) {
return partArr.indexOf(val) === -1;
});
答案 3 :(得分:1)
以下是其他一些方法:
var fullArr = [1,2,3,4];
var partArr = [2,3];
var newArr = [];
1.
fullArr.map(function(element){
if(partArr.indexOf(element) === -1) newArr.push(element);
})
console.log(newArr);
2.
for(i in fullArr){
if(partArr.indexOf(fullArr[i]) === -1) newArr.push(fullArr[i]);
}
console.log(newArr);
3.
fullArr.forEach(function(element){
if(partArr.indexOf(element) === -1) newArr.push(element);
})
console.log(newArr);
答案 4 :(得分:1)
实际上,您需要数组之间的公共部分。显然,您可以选择splice
或indexOf
来获得O(n * m)
甚至O(m * n^2)
表现。对于任何大于少数元素的数组来说,这显然是次优的
或者你可以使用对象作为哈希映射来查找差异(在最坏的情况下)O(n + m log m)
:
var fullArr = [1,2,3,4];
var partArr = [2,3];
var temporaryObject = Object.create(null);
partArr.forEach(el=>temporaryObject[el] = true); // temporaryObject after this operation is {"2": true, "3": true}
var newArr = fullArr.filter(el=>temporaryObject[el]);
在此示例中,我使用了名为“arrow functions”的ES6功能。它转换为以下ES5代码:
var partArr = [2, 3];
var temporaryObject = Object.create(null);
partArr.forEach(function (el) {
temporaryObject[el] = true;
}); // temporaryObject after this operation is {"2": true, "3": true}
var newArr = fullArr.filter(function (el) {
return temporaryObject[el];
});