如何从一个数组中减去多个对象与另一个数组

如何从一个数组中减去多个对象与另一个数组

问题描述:

我想要减去,即删除多个对象,即在array1中发现的array2的对象,以便最终结果是array2只包含“牛仔”对象。如何从一个数组中减去多个对象与另一个数组

帮助!我迷路了。

我尝试了多次代码,如下面的例子,但它没有奏效。

array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 
      
 
      array1.forEach(function (k) { 
 
       delete array2[k]; 
 
      }); 
 
      
 
      console.log(array2);

+0

可能[比较两个Javascript数组和删除重复项](https:// stackoverflow。com/questions/14930516/compare-two-javascript-arrays-and-remove-duplicates) –

这里是如何做到这一点:

function objectsEqual(o1, o2) { 
    return o1.caracname === o2.caracname 
} 

function subtractArrays(a1, a2) { 
    var arr = []; 
    a1.forEach((o1) => { 
     var found = false; 
     a2.forEach((o2) => { 
      if (objectsEqual(o1, o2)) { 
       found = true; 
      } 
     }); 
     if (!found) { 
      arr.push(o1); 
     } 
    }) 
    return arr; 
} 

console.log(subtractArrays(array2, array1)); 

固定在plunker:https://plnkr.co/edit/vA6oWg9R44f6k7ylyFh6?p=preview

+0

console.log显示未定义:https://plnkr.co/edit/CeQgUyhwh3cpYEPwmD30?p=preview – jean

+0

修复并添加了重击器 – Nayish

+0

您也可以在https://codepen.io/anon/pen/OxBOGy?editors=1111 – slevy1

使用此代码:[由@ slevy1建议]

var array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
var array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 

array1.forEach(function (k) { 
    var index = array1.valueOf(k); 
    array2.splice(index, 1); 
}); 

array2.forEach(function (o) { 
    console.log(o.caracname); 
}); 

codepen link

+0

查看这段代码我在这里运行你的代码https://codepen.io/anon/pen/KXGZPv?editors=1111并且没有得到预期的结果。 – slevy1

+0

Hi @ slevy1,谢谢你的努力。我编辑(修复)了我的代码,现在它正在工作。请再次测试bro。 – fatih

+0

@Fatih'index'不是一个数字(尝试'console.log(index)'),而array2.splice只是删除第一项 – Slai

事实证明,删除一个数组元素并不像删除一个变量那样容易;见here。 “已删除”元素未被删除,但获取未定义的值,而数组长度保持不变。

找到了一些有用的建议here。所以,可以使用数组2的splice方法,该方法根据MDN轻易执行以下操作:

拼接()方法通过去除现有 元件和/或添加新元素改变的数组的内容。

下面的代码片断作品每个阵列中的元素的顺序无关,如下所示:

var arr1 = [{ 
 
    "caracname": "charles" 
 
}, { 
 
    "caracname": "kevin" 
 
}]; 
 

 
var arr2 = [{ 
 
    "caracname": "charles" 
 
}, { 
 
    "caracname": "jean" 
 
}, { 
 
    "caracname": "kevin" 
 
}]; 
 

 
var tmp1 = "", 
 
    tmp2 = ""; 
 

 
for (var k = 0, key = "", maxLength = arr1.length; k < maxLength; k++) { 
 
    key = Object.keys(arr1[k])[0]; 
 
    
 
    for (var j = 0, maxLength_2 = arr2.length; j < maxLength_2; j++) { 
 
    
 
    tmp2 = arr2[j][key]; 
 
    tmp1 = arr1[k][key]; 
 
    
 
    if (tmp2 === tmp1) { 
 
     arr2.splice(j, 1); 
 
     maxLength_2--; // array2 length now one less 
 
     break; 
 
    }// end if 
 
    }// end inner-for 
 
}// end outer-for 
 

 
console.log(arr2);

我已经运行的代码here后修订本例中,改变一些变量名称作为结果。另外,您应该声明您的阵列为var或可选let;更多信息herehere

+1

“适当”的对象比较不容易https://stackoverflow.com/questions/1068834/object-comparison-in-javascript(这就是为什么我甚至没有在我的答案中尝试它,但只是比较他们的JSON字符串表示, Nayish只比较caracname属性的值)。在TypeScript https://www.typescriptlang.org/play/或类似的编辑器中粘贴JavaScript可能有助于注意到一些问题(不确定是否将Object.keys中的数组用作字符串[[key])是故意的) – Slai

+0

@Slai感谢这个信息。我修复了代码,以便现在var key保存一个字符串值。测试过的代码现在看起来好了,当我在Typescript网站上运行它时。 – slevy1

A,与库等Lodash容易一点:

array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 

 
array3 = _.differenceWith(array2, array1, _.isEqual) 
 

 
console.log(JSON.stringify(array3)) 
 

 
// or 
 
_.pullAllWith(array2, array1, _.isEqual) 
 

 
console.log(JSON.stringify(array2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

或有点不太有效,而不库:

array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 

 
j = JSON.stringify, array3 = array2.filter(e => array1.map(j).indexOf(j(e)) < 0) 
 

 
console.log(j(array3))