从对象数组中查找并删除对象
Find and remove object from array of objects
我有 2 个对象数组。
数组 1:
[{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }]
数组 2:
[{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }]
我需要完成 2 个任务:
1. 找出 array1 的哪些元素在 array2 中。找到项目后,我将对这些元素做一些事情。
2. 删除从 array2 中找到的元素。在对找到的项目进行处理后,我需要删除找到的每个项目。
我尝试用 lodash 来做,但没有成功。
我需要这样的东西:
if(elementFound) {
//do something
doSomething(item);
//after it, remove from array2
removeItemFromArray2(item);
}
谢谢,我想有一个简单的方法可以用 lodash 来完成。
尝试在这种情况下使用Array.prototype.filter
来实现你想要的,
var filteredArray = Array2.filter(function(itm){
return Array1.filter(function(itmIn){
return itmIn.id === itm.id && itmIn.ref === itm.ref;
}).length == 0;
});
当然有!如果元素满足某个谓词,您可以使用 _.remove
以编程方式从 array2
中删除元素。在您的情况下,该谓词将是 "is the element in array1
"、
var array1 = [{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }]
var array2 = [{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }]
_.remove(array2, function (item) {
return _.find(array1, item);
});
document.write("<pre>" + JSON.stringify(array2, null, 2) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>
具有线性 O 的解决方案。
var array1 = [{ id: 2, ref: 1010101 }, { id: 2, ref: 1010107 }],
array2 = [{ id: 2, ref: 10010001 }, { id: 2, ref: 10010002 }, { id: 2, ref: 10010003 }, { id: 2, ref: 10010006 }, { id: 2, ref: 10010007 }, { id: 2, ref: 10010008 }, { id: 2, ref: 10010009 }, { id: 2, ref: 10020005 }, { id: 2, ref: 1010101 }],
result = function (a, b) {
function k(x) { return x.id + '|' + x.ref; }
var o = {};
b.forEach(function (c) {
o[k(c)] = true;
});
a.forEach(function (c) {
o[k(c)] = false;
});
return b.filter(function (c) {
return o[k(c)];
});
}(array1, array2);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
为此有一个特定的 lodash 函数:
var array1 = [
{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }
];
var array2 = [
{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }
];
var res = _.differenceBy(array2, array1, 'ref');
document.write("<pre>" + JSON.stringify(res, null, 3) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>
我有 2 个对象数组。
数组 1:
[{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }]
数组 2:
[{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }]
我需要完成 2 个任务:
1. 找出 array1 的哪些元素在 array2 中。找到项目后,我将对这些元素做一些事情。
2. 删除从 array2 中找到的元素。在对找到的项目进行处理后,我需要删除找到的每个项目。
我尝试用 lodash 来做,但没有成功。
我需要这样的东西:
if(elementFound) {
//do something
doSomething(item);
//after it, remove from array2
removeItemFromArray2(item);
}
谢谢,我想有一个简单的方法可以用 lodash 来完成。
尝试在这种情况下使用Array.prototype.filter
来实现你想要的,
var filteredArray = Array2.filter(function(itm){
return Array1.filter(function(itmIn){
return itmIn.id === itm.id && itmIn.ref === itm.ref;
}).length == 0;
});
当然有!如果元素满足某个谓词,您可以使用 _.remove
以编程方式从 array2
中删除元素。在您的情况下,该谓词将是 "is the element in array1
"、
var array1 = [{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }]
var array2 = [{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }]
_.remove(array2, function (item) {
return _.find(array1, item);
});
document.write("<pre>" + JSON.stringify(array2, null, 2) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>
具有线性 O 的解决方案。
var array1 = [{ id: 2, ref: 1010101 }, { id: 2, ref: 1010107 }],
array2 = [{ id: 2, ref: 10010001 }, { id: 2, ref: 10010002 }, { id: 2, ref: 10010003 }, { id: 2, ref: 10010006 }, { id: 2, ref: 10010007 }, { id: 2, ref: 10010008 }, { id: 2, ref: 10010009 }, { id: 2, ref: 10020005 }, { id: 2, ref: 1010101 }],
result = function (a, b) {
function k(x) { return x.id + '|' + x.ref; }
var o = {};
b.forEach(function (c) {
o[k(c)] = true;
});
a.forEach(function (c) {
o[k(c)] = false;
});
return b.filter(function (c) {
return o[k(c)];
});
}(array1, array2);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
为此有一个特定的 lodash 函数:
var array1 = [
{ id: 2, ref: 1010101 },
{ id: 2, ref: 1010107 }
];
var array2 = [
{ id: 2, ref: 10010001 },
{ id: 2, ref: 10010002 },
{ id: 2, ref: 10010003 },
{ id: 2, ref: 10010006 },
{ id: 2, ref: 10010007 },
{ id: 2, ref: 10010008 },
{ id: 2, ref: 10010009 },
{ id: 2, ref: 10020005 },
{ id: 2, ref: 1010101 }
];
var res = _.differenceBy(array2, array1, 'ref');
document.write("<pre>" + JSON.stringify(res, null, 3) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>