javascript - 在javascript中将数组本身合并到另一个具有相同键的数组中

标签 javascript arrays algorithm typescript object

我正在尝试合并数组本身并将其转换为更有意义的数组

array = [
{item: 'pen', madeIn: 'US', color: 'blue'},
{item: 'pen', madeIn: 'US', color: 'white'},
{item: 'pen', madeIn: 'China', color: 'red'},
{item: 'pen', madeIn: 'China', color: 'white'}
]

我要生成的输出数组:

outputArray = [
{item: 'pen', madeIn: 'US', color: ['blue', 'white']},
{item: 'pen', madeIn: 'China', color: ['red', 'white']}
];

我一直在尝试但没有运气,目前我能想到的唯一解决方案是使用临时变量来存储项目和 madeIn 值。然后运行另一个循环来比较 item 和 madeIn,然后将颜色添加到数组中。有几个循环可以解决这个问题。

我的意思是它确实有效,但绝对不是最佳解决方案。 欢迎任何其他理想。谢谢。

最佳答案

Reduce使用 itemmadeIn 属性创建键的对象数组。对于每个对象,检查键是否已经存在,如果不存在,则为具有属性 color 的键创建一个新对象作为一个空数组。将每个对象的 color 推送到数组。使用 Object.values()将对象转换为数组。

const array = [{"item":"pen","madeIn":"US","color":"blue"},{"item":"pen","madeIn":"US","color":"white"},{"item":"pen","madeIn":"China","color":"red"},{"item":"pen","madeIn":"China","color":"white"}]

const result = Object.values(
  array.reduce((r, o) => {
    const key = `${o.item}-${o.madeIn}`
    
    if(!r[key]) r[key] = { ...o, color: [] }
    
    r[key].color.push(o.color)
    
    return r;
  }, {})
)

console.log(result)

关于javascript - 在javascript中将数组本身合并到另一个具有相同键的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55697886/

相关文章:

javascript - 这是使用 JS.map 的正确方法吗?

javascript - 多个元素的请求全屏

Javascript 仅提取捕获组

C# 和匿名对象数组

algorithm - qsort_b 和 qsort

arrays - 存在价格约束时如何从列表中最大化值(value)

c# - 在列表中查找最近的 sumElement 组合

javascript - 每个输入值到每个 <span> 或 <div>

javascript - 缩短代码并进行表单验证

Java 比较数组列表中数组中的元素