【问题标题】:How to merge these two arrays in nodejs如何在nodejs中合并这两个数组
【发布时间】:2021-08-27 09:23:44
【问题描述】:

数组 1:

[
  { _id: '01', user: 0, vendor: 1, driver: 0 },
  { _id: '04', user: 2, vendor: 15, driver: 2 },
  { _id: '05', user: 24, vendor: 10, driver: 1 },
  { _id: '06', user: 0, vendor: 18, driver: 0 }
]

数组 2:

[
  { _id: '04', order: 20 },
  { _id: '05', order: 28 },
  { _id: '06', order: 3 },
  { _id: '08', order: 1 }
]

我需要这样的输出

[
  { _id: '01', user: 0, vendor: 1, driver: 0 },
  { _id: '04', user: 2, vendor: 15, driver: 2, order: 20 },
  { _id: '05', user: 24, vendor: 10, driver: 1, order: 28 },
  { _id: '06', user: 0, vendor: 18, driver: 0, order: 3 },
  { _id: '08', user: 0, vendor: 0, driver: 0, order: 1 }
]

我正在使用 lodash 来合并数组,

let merge = _.merge(arr1, arr2);

但是,得到这样的输出

 [
  { _id: '04', user: 0, vendor: 1, driver: 0, order: 20 },
  { _id: '05', user: 2, vendor: 15, driver: 2, order: 28 },
  { _id: '06', user: 24, vendor: 10, driver: 1, order: 4 },
  { _id: '06', user: 0, vendor: 18, driver: 0 }
]

请帮我这样做

【问题讨论】:

标签: javascript node.js arrays express lodash


【解决方案1】:

您可以使用mapfind 实现此结果

const arr1 = [
  { _id: "01", user: 0, vendor: 1, driver: 0 },
  { _id: "04", user: 2, vendor: 15, driver: 2 },
  { _id: "05", user: 24, vendor: 10, driver: 1 },
  { _id: "06", user: 0, vendor: 18, driver: 0 },
];

const arr2 = [
  { _id: "04", order: 20 },
  { _id: "05", order: 28 },
  { _id: "06", order: 4 },
];

const result = arr1.map((obj) => {
  const objInArr2 = arr2.find((o) => o._id === obj._id);
  if (objInArr2) return { ...obj, ...objInArr2 };
  else return { ...obj };
});

console.log(result);

编辑:如果某个对象存在于arr2 但不存在于arr1

const arr1 = [
  { _id: "01", user: 0, vendor: 1, driver: 0 },
  { _id: "04", user: 2, vendor: 15, driver: 2 },
  { _id: "05", user: 24, vendor: 10, driver: 1 },
  { _id: "06", user: 0, vendor: 18, driver: 0 },
];

const arr2 = [
  { _id: "04", order: 20 },
  { _id: "05", order: 28 },
  { _id: "06", order: 3 },
  { _id: "08", order: 1 },
];

const result = arr1.map((obj) => {
  const objInArr2 = arr2.find((o) => o._id === obj._id);
  if (objInArr2) return { ...obj, ...objInArr2 };
  else return { ...obj };
});

arr2.forEach((obj) => {
  const isExist = result.find((o) => o._id === obj._id);
  if (!isExist) result.push({ user: 0, vendor: 0, driver: 0, ...obj });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 它正在工作,什么是 arr2 有更多大于 06 的对象,它不返回值
  • 编辑问题,你想要的结果是什么?
  • 如果对象存在于arr2 但不存在于arr1 中,是否要在最终结果中添加该对象。是这样吗?
  • 请允许我 2-3 分钟
  • 好的没问题
【解决方案2】:

将第二个数组放入一个Map中,以便_id高效查找,然后映射第一个数组

const arr1=[
  { _id: '01', user: 0, vendor: 1, driver: 0 },
  { _id: '04', user: 2, vendor: 15, driver: 2 },
  { _id: '05', user: 24, vendor: 10, driver: 1 },
  { _id: '06', user: 0, vendor: 18, driver: 0 }
]

const arr2=[
  { _id: '04', order: 20 },
  { _id: '05', order: 28 },
  { _id: '06', order: 4 }
]

const arr2Map = new Map(arr2.map(({_id,...r}) => [_id, r]))

const res = arr1.map(e => Object.assign({}, e, arr2Map.get(e._id)))

console.log(res)

【讨论】:

    【解决方案3】:

    如果您使用的是lodash,请尝试改用mergeWith。确保使用customizer 选项。

    另一种方式https://www.npmjs.com/search?q=merge%20deep

    【讨论】:

      【解决方案4】:

      let arr1 = [
        { _id: '01', user: 0, vendor: 1, driver: 0 },
        { _id: '04', user: 2, vendor: 15, driver: 2 },
        { _id: '05', user: 24, vendor: 10, driver: 1 },
        { _id: '06', user: 0, vendor: 18, driver: 0 }
      ];
      
      let arr2 = [
        { _id: '04', order: 20 },
        { _id: '05', order: 28 },
        { _id: '06', order: 4 }
      ];
      
      arr2.forEach(e => {
       let obj = arr1.find(a => a._id === e._id);
       if(obj)
        obj.order = e.order
      });
      
      console.log(arr1);

      【讨论】:

        猜你喜欢
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多