Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 整数数组比较_Javascript_Arrays - Fatal编程技术网

Javascript 整数数组比较

Javascript 整数数组比较,javascript,arrays,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 (v

我有一个关于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;
    } 
  }
}
做这个的好方法是什么?谢谢。

这里有一个

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);
})

这是您的需求代码

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]);
};
var fullArr=[1,2,3,4];
var partArr=[2,3];
var newArr=[];

对于(var i=0;i,可以使用在数组上工作的
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;
});

以下是其他几种方法:

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);

事实上,您希望阵列之间有一个公共部分。显然,您可以选择
splice
indexOf
来获得
O(n*m)
甚至
O(m*n^2)
性能。对于任何大于几个元素的阵列来说,这显然是次优的

或者您可以使用对象作为散列映射来查找(在最坏的情况下)
O(n+m log m)

在本例中,我使用了名为“”的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];
});

但是它没有正常工作
它是如何工作的?它会给你带来什么结果?附带说明,这可能与你的代码无关,但一般来说,在数组中使用
for…是个坏主意,因为顺序不能保证。使用常规的
for
循环。使用
数组。过滤器是更简单的解决方案,但您可能还需要查看文档,因为您没有正确地使用它尝试向
newArr
添加一个项目时,使用
push
会更容易。一点解释可能会改善您的回答真的?Array.filter和Array.indexOf应该是新手javascript编程人员的面包和黄油。很明显,他们不在OP中。因此,也许您可以帮他们一点忙?或者,为什么费心回答吗?@MattBurland你知道,我已经回答了很多问题,OP回答说“哦,当然,我应该看到”…不能赢:p-添加了解释,完全抄袭了mdn:pThanks的解释!
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];
});