繁体   English   中英

比较两个Object数组和匹配值

[英]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相关联。

你可以做一个内部reducemap

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM