比较两个对象数组并匹配值

时间:2019-04-03 14:49:14

标签: javascript arrays json mongodb

我有两个如下数组的对象

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是否具有与b.secondObj._id匹配的Ref,然后尝试将first.Obj元素分配给匹配的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;
                    }
                })
);

3 个答案:

答案 0 :(得分:0)

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。

答案 1 :(得分:0)

您可以使用内部map进行reduce

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]) {部分更改为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))。

答案 2 :(得分:0)

/ *此代码将识别与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>