Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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 - Fatal编程技术网

Javascript 在另一个数组中查找项并从数组中删除匹配项

Javascript 在另一个数组中查找项并从数组中删除匹配项,javascript,Javascript,我有两个记录如下的数组: var cars = ["Saab", "Volvo", "BMW"]; var cars1 = ["Saab", "Volvo", "BMW"]; 现在我想从Cars1中删除匹配元素,因此最后我的Cars1数组如下所示: var cars=[“萨博”、“沃尔沃”、“宝马”]; var cars1=[“萨博”、“沃尔沃”、“宝马”]; 对于(变量i=0;i-1) } console.log( 差异(汽车、汽车1), 中间人(汽车、汽车1) );您得到了错误的结

我有两个记录如下的数组:

var cars = ["Saab", "Volvo", "BMW"]; 

var cars1 = ["Saab", "Volvo", "BMW"]; 
现在我想从Cars1中删除匹配元素,因此最后我的Cars1数组如下所示:

var cars=[“萨博”、“沃尔沃”、“宝马”];
var cars1=[“萨博”、“沃尔沃”、“宝马”];
对于(变量i=0;iconsole.log(cars1)
您缺少一些项目,因为在迭代时,已删除的项目将替换为下一个项目。以另一种方式循环,i减小:

var cars=[“萨博”、“沃尔沃”、“宝马”];
var cars1=[“萨博”、“沃尔沃”、“宝马”];
对于(var i=cars1.length;i--;){
对于(var j=0;jconsole.log(cars1)
使用一种简单的功能方法来节省一些空间并使其更干净,我建议将
Array.prototype.filter
Array.prototype.indexOf
结合使用,如下所示:

var cars=[“萨博”、“沃尔沃”、“宝马”];
var cars1=[“萨博”、“沃尔沃”、“宝马”、“大众”];
cars1=cars1.filter(car=>cars.indexOf(car)<0)

console.log(cars1)
您尝试执行的操作称为
差异
。相反的是
交叉口

var cars=[“萨博”、“沃尔沃”、“宝马”、“斯柯达”];
var cars1=[“萨博”、“沃尔沃”、“宝马”];
功能差异(arr1、arr2){
返回arr1.filter(x=>arr2.indexOf(x)=-1)
}
中间层功能(arr1、arr2){
返回arr1.filter(x=>arr2.indexOf(x)>-1)
}
console.log(
差异(汽车、汽车1),
中间人(汽车、汽车1)

);您得到了错误的结果,因为对于每个
切片()
,其中的元素都在更改其索引。因此,在第一个循环之后,
Volvo
将获得
0
索引,并且实际上具有
0
索引的项目已经被处理,因此函数不会对其进行操作。这就是为什么它在运行后仍留在内部

我建议您使用
Array#filter

var cars=[“萨博”、“沃尔沃”、“宝马”],
cars1=[“萨博”、“沃尔沃”、“宝马”];
var result=cars.filter(v=>cars1.indexOf(v)=-1);

控制台日志(结果)在第一次调用cars1.splice(i,1)之后,cars1少了一个元素,因此继续使用外部循环没有多大意义。 为了使代码更简洁,我建议使用indexOf而不是内部循环

var cars = ["Saab", "Volvo", "BMW"];
var cars1 = ["Saab", "Volvo", "BMW"];

for (var i = 0; i < cars.length; i++) {
  var carPositionInCars1 = cars1.indexOf(cars[i]);
  if (carPositionInCars1 != -1) {
    cars1.splice(carPositionInCars1, 1);
  }
}
console.log(cars1);
var cars=[“萨博”、“沃尔沃”、“宝马”];
var cars1=[“萨博”、“沃尔沃”、“宝马”];
对于(变量i=0;i
请注意这一重要区别:原始阵列未更新。这可能很重要,取决于OP的需要(阵列通常是共享的)。你也没有解释OP的错误。是的!这就是我将
cars1
重新分配给筛选器调用的返回值的原因。是的,但在共享数组时这还不够(这是使用splice的最常见原因)我不喜欢这里的大多数答案甚至都没有试图理解OP的错误。我对你帮助我的努力投了赞成票。我在两个数组中都有1000条记录,所以你认为哪种方法更合适???@在这种情况下学习使用集合。我将进行更新,向您展示如何再次对您进行错误检测,但从IE11开始,此设置和减少在所有浏览器和旧浏览器中都有效。它必须稍作调整,以覆盖旧版本的Internet Explorer。你也想看那个版本吗?(编辑:完成)集合实例或用作集合的普通对象经过优化,可按名称查看特性。后面的默认结构是a,它由V8等优秀引擎进一步优化,特别是当它被重用时。请提供一些关于代码实际功能的信息。你在哪里改进了OPs代码,他做错了什么。。。仅仅从没有任何解释就向您抛出的几行随机代码中学习是很困难的。