将数组值推送到对象

时间:2021-01-15 13:31:33

标签: javascript arrays object

我有一个嵌套数组。我想从数组中获取值并推送到新的单个对象。 应读取以 _id 作为对象键,类别数组字段应为 _id 的值

const Ll = [
  {
    _id: 'milk',
    category: [
      [
        {
          name: 'Alfred',
          job: 'manager'
        },
        {
          name: 'Mark',
          job: 'manager'
        }
      ]
    ]
  },
  {
    _id: 'grocery',
    category: [
      [
        {
          name: 'William',
          job: 'manager'
        }
      ]
    ]
  }
]

我想要这样的对象,

const obj = {
  milk: [
    {
      name: 'Alfred',
      job: 'manager'
    },
    {
      name: 'Mark',
      job: 'manager'
    }
  ],
  grocery: [
    {
      name: 'William',
      job: 'manager'
    }
  ]
}

有可能做到 谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用 Array.prototype.reduce() 方法来完成。遍历数组并按 _id 分组。

const data = [
  {
    _id: 'milk',
    category: [
      [
        {
          name: 'Alfred',
          job: 'manager',
        },
      ],
    ],
  },
  {
    _id: 'grocery',
    category: [
      [
        {
          name: 'William',
          job: 'manager',
        },
      ],
    ],
  },
  {
    _id: 'milk',
    category: [
      [
        {
          name: 'Mark',
          job: 'manager',
        },
      ],
    ],
  },
];
const ret = data.reduce((prev, c) => {
  const p = prev;
  const key = c._id;
  p[key] = p[key] ?? [];
  p[key].push(...c.category.flat());
  return p;
}, {});
console.log(ret);

ES6:

const data = [
  {
    _id: 'milk',
    category: [
      [
        {
          name: 'Alfred',
          job: 'manager',
        },
      ],
    ],
  },
  {
    _id: 'grocery',
    category: [
      [
        {
          name: 'William',
          job: 'manager',
        },
      ],
    ],
  },
  {
    _id: 'milk',
    category: [
      [
        {
          name: 'Mark',
          job: 'manager',
        },
      ],
    ],
  },
];
const ret = data.reduce((prev, c) => {
  const p = prev;
  const key = c._id;
  p[key] = p[key] || [];
  p[key].push(...c.category.reduce((acc, val) => acc.concat(val), []));
  return p;
}, {});
console.log(ret);

答案 1 :(得分:1)

您可以使用 reduce 累积空对象

技术结合:

const data = [ { _id: "milk", category: [ [ { name: "Alfred", job: "manager", }, { name: "Mark", job: "manager", }, ], ], }, { _id: "grocery", category: [ [ { name: "William", job: "manager", }, ], ], }, ];

const res = data.reduce(
  (acc, { _id, category }) => ({ ...acc, [_id]: category.flat() }),
  {}
);

console.log(res);

答案 2 :(得分:1)

这里有适合您的解决方案。

const obj = {};
data.forEach(d => {
    const categories = d.category.reduce((a, v) => a.concat(v), []);
    obj[d._id] = obj[d._id] ? [...obj[d._id], ...categories] : [...categories];
});

console.log(obj);

答案 3 :(得分:0)

const keys = [...new Set(data.map(item => item._id))];

const newObj = keys.reduce((acc, curr) => {
  const value = data.filter(({ _id }) => _id === curr).map(({ category }) => {
    return {
      ...category[0][0]
    }
  });

  return {
    ...acc,
    [curr]: value
  }
}, {});