[英]compare two Object array and match value
我有两个像下面的数组对象
var a={
firstObj:
[
{
Ref: "5ca3cd6aefbc9f1782b5db53",
status: "hhhh"
},
{
Ref: "5ca3cdc6efbc9f1782b5db5c",
status: "hhhh"
},
{
Ref: "5ca3cdc6efbc9f1782b5db5c",
status: "hhhh"
},
{
Ref: "5ca3cdc6efbc9f1782b5db5c",
status: "hhhh"
}
]
};
var b={
secondObj: [
{
_id: "5ca3cd6aefbc9f1782b5db53"
},
{
_id: "5ca3cdc6efbc9f1782b5db5c"
},
]
}
我想检查a.firstObj是否匹配Ref to b.secondObj._id如果它已经我试图分配到firstObj元素匹配b.secondObj.new但不知何故_id不匹配
我正在尝试通过地图
a.firstObj.map(item =>
b.secondObj.map((_item, index) => {
console.log(_item._id.toString());
console.log(item.Ref.toString());
if (_item._id == item.Ref) {
b.secondObj[index].new = item;
}
})
);
AFAI经过测试......是的,它是匹配的。 看一看:
var a={ firstObj: [ { Ref: "5ca3cd6aefbc9f1782b5db53", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" } ] }; var b={ secondObj: [ { _id: "5ca3cd6aefbc9f1782b5db53" }, { _id: "5ca3cdc6efbc9f1782b5db5c" }, ] } a.firstObj.map(item => b.secondObj.map((_item, index) => { //console.log(_item._id.toString()); //console.log(item.Ref.toString()); if (_item._id == item.Ref) { b.secondObj[index].new = item; } }) ); console.log(b)
你可能错过了什么。 如果你还想知道其他任何事情,请重新制定,我会改变答案。
请理解,使用此代码,由于对象具有许多相等的Ref元素,因此关联将与最后的Ref相关联。
你可以做一个内部reduce
的map
:
var a={ firstObj: [ { Ref: "5ca3cd6aefbc9f1782b5db53", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hhhh" } ] }; var b={ secondObj: [ { _id: "5ca3cd6aefbc9f1782b5db53" }, { _id: "5ca3cdc6efbc9f1782b5db5c" }, ] } function mergeByEqProp (propA, propB, listA, listB) { return listB.map(function (b) { return listA.reduce(function (acc, a) { if (!acc && a[propA] === b[propB]) { return Object.assign({}, b, {new: a}); } return acc; }, null); }); } console.log(mergeByEqProp('Ref', '_id', a.firstObj, b.secondObj));
它首先map
第二个列表,然后reduce
第一个列表中的项目,直到找到匹配项。 一旦找到匹配,它就会一直返回。 我添加了该功能,因为它看起来像a.firstObj
有一些重复(仔细查看Ref
属性)。 如果没有问题,只需更改if (!acc && a[propA] === b[propB]) {
part to if (a[propA] === b[propB]) {
。
Object.assign
部分也值得一些解释:
首先,如果你不在 ES6 / ES2015 +环境中工作,你需要另一个函数作为替代 - 例如$.extend
工作得很好。 或者写自己的,比如:
function assign (a /*, ...rest */) {
var r = Array.prototype.slice.call(arguments, 1);
return r.reduce(function (acc, x) {
for (var y in x) {
if (x.hasOwnProperty(y)) { acc[y] = x[y]; }
}
return acc;
}, a);
}
要解释的另一件事是空{}
:它只是首先创建一个副本并改变该副本而不是原始项。 如果这不打扰你,只需使用Object.assign(b, a)
(或你自己的assign(b, a)
)。
/ *此代码将标识与Ref id匹配的所有项目,然后将它们作为数组分配给secondObj中的新属性* /
<script type="text/javascript"> var a={ firstObj: [ { Ref: "5ca3cd6aefbc9f1782b5db53", status: "abcd" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "efgh" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "hijk" }, { Ref: "5ca3cdc6efbc9f1782b5db5c", status: "lmno" } ] }; var b={ secondObj: [ { _id: "5ca3cd6aefbc9f1782b5db53" }, { _id: "5ca3cdc6efbc9f1782b5db5c" }, ] } let equality = []; for(let i=0; i<b.secondObj.length ; i++){ let itemB = b.secondObj[i]; equality.push(a.firstObj.filter(itemA => itemA.Ref == itemB._id)) ; } equality.map((value, index) => b.secondObj[index].new = value); //<=== in case if there are more than one equal items in firstObj //equality.map((value, index) => b.secondObj[index].new = value[0]); <== only asign one item to 'new' console.log(b); </script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.