在 Node 中,如何将对象数组合并到一个新数组中,其中每个对象名称在字符串数组中都有其值?

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

我有一个看起来像这样的对象数组:

const arr = [
    {
        "name": "Day",
        "value": "Monday"
    },
    {
        "name": "Month",
        "value": "November"
    },
    {
        "name": "Day",
        "value": "Monday"
    },
    {
        "name": "Month",
        "value": "December"
    },
    {
        "name": "Day",
        "value": "Friday"
    },
    {
        "name": "Month",
        "value": "November"
    },
    {
        "name": "Day",
        "value": "Friday"
    },
    {
        "name": "Month",
        "value": "December"
    }
]

但我需要将对象数组修改为:

const final = [
    {
        "name": "Day",
        "values": [
            "Monday",
            "Friday"
        ]
    },
    {
        "name": "Month",
        "values": [
            "November",
            "December"
        ]
    }
]

我可以用以下方法过滤掉重复项:

const filtered = arr.filter(
    (v, i, a) =>
      a.findIndex(v2 => v?.name === v2?.name && v?.value === v2?.value) === i
  );

但我坚持采用一种有效的方法来做到这一点,而无需 Lodash下划线,并且我尝试使用

Object.assign()
但我的实现不起作用:

const test = filtered.map(({ name, value }) =>
    Object.assign({ name, value: [] }, (name, value))
  );
console.log(test)

我想我之前见过这个问题并测试过以下答案:

在对象数组中,我可以组合具有相同名称但值位于字符串数组中的对象吗?

node.js arrays javascript-objects
1个回答
0
投票

使用 reduce 和预先分配了天和蛾元素的起始值,使用

Set
自动忽略重复项,然后在减少所有内容后,将该集合转换为数组:

const arr = [
    {
        "name": "Day",
        "value": "Monday"
    },
    {
        "name": "Month",
        "value": "November"
    },
    {
        "name": "Day",
        "value": "Monday"
    },
    {
        "name": "Month",
        "value": "December"
    },
    {
        "name": "Day",
        "value": "Friday"
    },
    {
        "name": "Month",
        "value": "November"
    },
    {
        "name": "Day",
        "value": "Friday"
    },
    {
        "name": "Month",
        "value": "December"
    }
]


const final = arr.reduce((t, {name, value}) => {
  t.find(e => e.name === name)?.values.add(value);
  return t;
}, [
  {name:`Day`, values: new Set()},
  {name:`Month`, values: new Set()}
]);

final.forEach(e => e.values = [...e.values]);

console.log(final);

© www.soinside.com 2019 - 2024. All rights reserved.