如何以分配内部对象的方式连接数组?

问题描述 投票:0回答:1

好吧,解释我想要的东西有点难。让我更详细地解释一下。我有一个对象数组。因为数组元素的“唯一”标识符是它们的索引,如果我们想要更改元素,我们需要知道哪个是目标索引。但即使我们有索引,我也不想改变整个对象,只需分配新对象并将它们“合并”在一起即可。

我有一个难看的解决方案,但至少让我更有意义:

const users = [
      {
        id: 0,
        name: "John",
        hobby: "soccer"
      },
      {
        id: 1,
        name: "Alice",
        hobby: "squash"
      },
      {
        id: 2,
        name: "Greg",
        hobby: "guitar"
      }
    ]

    const newUsers = [
      {
        id: 0,
        work: "developer"
      },
      {
        id: 2,
        work: "musician"
      },
      {
        id: 3,
        name: "Roger",
        work: "accountant"
      }
    ]

const concatArray = (newArray, oldArray) => {
  const objectFromArray = array => array.reduce((object, user) => {
    object[user.id] = user;
    return object
  }, {});

  const objectOfOldArray = objectFromArray(oldArray);
  const objectOfNewArray = objectFromArray(newArray);
  
  const allIds = Object.keys({...objectOfOldArray, ...objectOfNewArray})
  
  return allIds.map(id => {
    const oldProps = objectOfOldArray[id] || {};
    const newProps = objectOfNewArray[id] || {};
    return {id, ...oldProps, ...newProps}
  })
}

console.log(concatArray(newUsers, users))

它工作正常,但应该有一个更充分的解决方案。我的意思是这是一个非常小的操作,为指定的对象添加了一些属性,但是我的解决方案过于复杂而无法获得。应该有一种更简单的方法来赚钱。

javascript
1个回答
3
投票

您可以尝试下面的Array.forEach方法

const users = [
      {
        id: 0,
        name: "John",
        hobby: "soccer"
      },
      {
        id: 1,
        name: "Alice",
        hobby: "squash"
      },
      {
        id: 2,
        name: "Greg",
        hobby: "guitar"
      }
    ]

const newUsers = [
  {
    id: 0,
    work: "developer"
  },
  {
    id: 2,
    work: "musician"
  },
  {
    id: 3,
    name: "Roger",
    work: "accountant"
  }
]

let updatedUsers = {};

[...users, ...newUsers].forEach(d => updatedUsers[d.id] = { ...(updatedUsers[d.id] || {}), ...d })

console.log(Object.values(updatedUsers))
© www.soinside.com 2019 - 2024. All rights reserved.