【问题标题】:How to merge object with jquery by id如何通过 id 将对象与 jquery 合并
【发布时间】:2021-09-26 08:45:33
【问题描述】:

我需要能够连接两个 JavaScript 对象,如下所示:

let arr1 = [
              {"0": { id: "abdc4051", date: "2017-01-24" }},
              {"1": { id: "abdc4052", date: "2017-01-22" }}
           ];
let arr2 = [
              {"0": { category: "Sport", data: {code: "abdc4051", name: "ab"} } },
              {"1": { category: "Others", data: {code: "abdc4052", name: "abc"} } }
           ];

有没有人有这方面的脚本或知道这样做的内置方法? 我希望将日期添加到 arr2 上的数据中,条件代码等于 id

【问题讨论】:

  • 欢迎来到 SO!你试过什么?你在哪里失败了?
  • 你能在这里告诉你你在期待什么吗?您的预期输出是什么?
  • 为什么你的对象有顺序的初始属性? {"0": ...}, {"1": ...}

标签: javascript jquery arrays object


【解决方案1】:

您的对象形状使这比应有的更难。您确定要每个对象中的顺序属性,还是记录/不良解析的产物?

如果你真的需要它们,你需要解决它们,在下面的 sn-p 中使用 Object.values()arr1 创建一个 Map,并在最后的 map() 调用中使用 Object.entries()arr2 上存储顺序键,然后在合并逻辑后的返回中重新引入。

const
  arr1 = [{ "0": { id: "abdc4051", date: "2017-01-24" } }, { "1": { id: "abdc4052", date: "2017-01-22" } }],
  arr2 = [{ "0": { category: "Sport", data: { code: "abdc4051", name: "ab" } } }, { "1": { category: "Others", data: { code: "abdc4052", name: "abc" } } }],

  // create map of dates: Map(2) { 'abdc4051' => '2017-01-24', 'abdc4052' => '2017-01-22' }
  dateMap = new Map(arr1.map(o => {
    const [{ id, date }] = Object.values(o);
    return [id, date];
  })),
  
  // map over arr2, get date from Map and add it to 'data' if it exists
  result = arr2.map(o => {
    const [[k, _o]] = Object.entries(o);
    const date = dateMap.get(_o.data.code);
    return {
      [k]: {
        ..._o,
        data: { ..._o.data, ...(date ? { date } : {}) }
      }
    };
  });

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

如果您不需要初始顺序键,则合并变得不那么冗长。

const
  arr1 = [{ id: "abdc4051", date: "2017-01-24" }, { id: "abdc4052", date: "2017-01-22" }],
  arr2 = [{ category: "Sport", data: { code: "abdc4051", name: "ab" } }, { category: "Others", data: { code: "abdc4052", name: "abc" } }],

  dateMap = new Map(arr1.map(o => [o.id, o.date])),

  result = arr2.map(o => (
    {
      ...o,
      data: { ...o.data, ...(dateMap.has(o.data.code) ? { date: dateMap.get(o.data.code) } : {}) }
    }
  ));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2022-11-24
    相关资源
    最近更新 更多