-1

我有两个数组:

阵列 1:

[
    {
        name: 'Bob',
        traits: {
            id: 1
        }
    }, {
        name: 'Karl',
        traits: {
            id: 2
        }
    }, {
        name: 'Joseph',
        traits: {
            id: 3
        }
    }
]

阵列 2:

[
    {
        name: 'Karl',
        user_id: 2,
        dog: 'Rottweiler'
    }, {
        name: 'Joseph',
        user_id: 3,
        dog: 'Poodle'
    }, {
        name: 'Bob',
        user_id: 1,
        dog: 'Puppy'
    }
]

期望的结果:

我希望能够通过查找 user_id 与 id 匹配的元素然后将对象添加到数组来将第二个数组合并到第一个数组中。

例如:

数组 1 对象

{
    name: 'Bob',
    traits: {
        id: 1
    }
}

由于 id 与数组 2 obj user_id 匹配:

{
    name: 'Bob',
    user_id: 1,
    dog: 'Puppy'
}

最终结果将是:

{
    name: 'Bob',
    traits: {
        name: 'Bob',
        user_id: 1,
        dog: 'Puppy'
    }
}
4

4 回答 4

1

arr2.forEach((obj) => {
    const idx = arr1.findIndex((o) => o.traits.id === obj.user_id);
    if (idx !== -1) {
        arr1[idx] = { ...arr1[idx], traits: { ...obj } }
    }
})

console.log(arr1[0]) // { name: 'Bob', traits: { name: 'Bob', user_id: 1, dog: 'Puppy' } }

于 2021-05-28T14:44:55.797 回答
0

将第二个数组转换为以 为键的映射user_id,然后迭代第一个数组。在地图中找到对应的对象,并将匹配的对象值传播到traits属性中:

let arr1 = [{name: 'Bob',traits: {id: 1}},{name: 'Karl',traits: {id: 2}},{name: 'Joseph',traits: {id: 3}}];
let arr2 = [{name: 'Karl', user_id: 2,dog: 'Rottweiler'},{name: 'Joseph', user_id: 3,dog: 'Poodle'},{name: 'Bob',user_id: 1,dog: 'Puppy'}];

let map = new Map(arr2.map(item => [item.user_id, item]));

let result = arr1.map(item => {
    let traits = map.get(item.traits.id);
    return traits ? { ...item, traits} : item;
});

console.log(result);

由于在 map 中的查找具有 O(1) 的分摊时间复杂度,这比在每次迭代中查找数组中的键(如调用find)更有效。

于 2021-05-28T14:41:41.823 回答
0

您可以使用mapfind轻松实现此结果。只需映射第一个数组并obj.traits.idarr2. 然后返回想要的结果。

const arr1 = [
  {
    name: "Bob",
    traits: {
      id: 1,
    },
  },
  {
    name: "Karl",
    traits: {
      id: 2,
    },
  },
  {
    name: "Joseph",
    traits: {
      id: 3,
    },
  },
];

const arr2 = [
  {
    name: "Karl",
    user_id: 2,
    dog: "Rottweiler",
  },
  {
    name: "Joseph",
    user_id: 3,
    dog: "Poodle",
  },
  {
    name: "Bob",
    user_id: 1,
    dog: "Puppy",
  },
];

const result = arr1.map((obj) => {
  const { name, traits } = obj;
  const isExist = arr2.find((o) => o.user_id === traits.id);
  if (isExist) {
    return { name, traits: { ...isExist } };
  }
  return obj;
});

console.log(result);

于 2021-05-28T14:42:07.980 回答
0

let a = [
    {
        name: 'Bob',
        traits: {
            id: 1
        }
    }, {
        name: 'Karl',
        traits: {
            id: 2
        }
    }, {
        name: 'Joseph',
        traits: {
            id: 3
        }
    }
    ];

    let b = [
        {
            name: 'Karl',
            user_id: 2,
            dog: 'Rottweiler'
        }, {
            name: 'Joseph',
            user_id: 3,
            dog: 'Poodle'
        }, {
            name: 'Bob',
            user_id: 1,
            dog: 'Puppy'
        }
    ];
    
    a.map(aobj =>{
    let sameIdObj = b.find( bobj => bobj.user_id === aobj.traits.id )
    sameIdObj && (aobj.traits =  sameIdObj)
    })

    console.log(a);

于 2021-05-28T15:09:15.703 回答