整数数组比较

时间:2015-09-08 13:37:23

标签: javascript arrays

我对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;
    } 
  }
}

制作此产品的好方法是什么?感谢。

5 个答案:

答案 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)

实际上,您需要数组之间的公共部分。显然,您可以选择spliceindexOf来获得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];
});