将对象数组缩减为键值映射



我有一个对象数组。我需要制作一个对象,这样我就可以根据id获取名称。

const drinks = [
{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
];

我试过这个,它几乎有效:

console.log(drinks.reduce(
(accumulator, currentValue) => 
Object.assign(accumulator, accumulator[currentValue._id] = currentValue.name), {}));

然而,它输出:

Object { 
0: "F", 1: "l", 2: "a", 3: "t", 4: " ", 5: "W", 6: "h", 7: "i", 8: "t", 9: "e",
5fe40ad4d2e6e6de85c46a6c: "Americano", 
5fe40ad4d2e6e6de85c46a6d: "Latte", 
5fe40ad4d2e6e6de85c46a6e: "Flat White" 
}

我需要:

Object { 
5fe40ad4d2e6e6de85c46a6c: "Americano", 
5fe40ad4d2e6e6de85c46a6d: "Latte", 
5fe40ad4d2e6e6de85c46a6e: "Flat White"
}

为什么我的函数也将其中一个值分解为字符?

const drinks = [{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }];

const result=drinks.reduce((acc,curr)=>{
acc[curr._id]=curr.name;
return acc;
},{})

console.log(result)

您可以将数组映射到条目(键/值对(的数组中,然后您可以通过Object.fromEntries()运行该数组以创建最终对象

const drinks = [
{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
]

const result = Object.fromEntries(drinks.map(({ _id, name }) =>
[ _id, name ]))

console.log(result)

较长的版本将类似于这个

const result = drinks.reduce((obj, { _id, name }) => ({
...obj, // spread syntax is like `Object.assign()`
[ _id ]: name // use `_id` as a dynamic object key with value `name`
}), {})

当前代码的问题是。。。

accumulator[currentValue._id] = currentValue.name

是指定的值(即currentValue.name(。当在Object.assign()中用作参数时,它被分解为对象条目,从而产生

{ 
0: "F", 
1: "l", 
2: "a", 
3: "t", 
4: " ", 
5: "W", 
6: "h", 
7: "i", 
8: "t", 
9: "e"
}

只需将对象{ [currentValue._id]: currentValue.name }传递给assign,而不是分配accumulator[currentValue._id] = currentValue.name

const drinks = [
{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
{ _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
];
console.log(drinks.reduce(
(accumulator, currentValue) => 
Object.assign(accumulator, { [currentValue._id]: currentValue.name }), {}));

这将适用于

drinks.map(({ _id, name }) => ({
[_id]: name
}))

最新更新