【问题标题】:JavaScript remove object from array if value exists in other array如果值存在于其他数组中,JavaScript 从数组中删除对象
【发布时间】:2016-08-27 03:12:54
【问题描述】:
我正在使用 Firebase,因此如果有更有效的方法来构建这些数据以便能够仅查询登录用户尚未查看的卡片,我愿意走这条路线好。现在我正在尝试事后进行过滤。
我的应用程序中包含一个包含所有卡片的数组,如下所示:
我有第二个数组,其中包含用户已经看过的所有卡片的信息。我希望能够查看两个数组,如果数组 2 中的 cid 与数组 1 中的 $id 匹配,则从数组 1 中完全删除该对象。
【问题讨论】:
标签:
javascript
arrays
firebase
【解决方案1】:
这实际上很容易以函数的方式实现:
array1 = array1.filter(item => array2.every(item2 => item2.cid != item.$id));
Array.prototype.filter() 以数组的形式返回数组的元素,这些元素导致提供的函数返回 true。我们的过滤器评估器会说“如果 array2 中没有 CID 与该项目的 ID 匹配的项目,则返回 true”。
因为filter()正在返回一个新数组,所以没有必要使用splice();我们可以将 array1 重新分配给新过滤的数组。
【解决方案2】:
遍历数组并使用拼接删除元素
for(var i =0; i< array2.length; i++ ) {
for(var j= 0; j< array1.length;j++) {
if (array2[i].$id === array1[j].$id) {
array1.splice(j,1);
break;
}
}
【解决方案3】:
为什么不为此使用一组对象。为此保留一个对象键
看过
默认情况下保持 seen 为 false。并使用firebase-query,其中看到的列是假的。
或者您可以在获取代码中的数据后执行类似的操作。
var resultarray = [];
for(var i =0; i< array1.length; i++ ) {
var flag = true;
for(var j= 0; j< array2.length;j++) {
if (array1[1].$id === array2[2].$id) {
flag = false;
break;
}
}
if(flag === true) {
resultarray.push(array1[i]);
}
}