b我有這個簡單的陣列,如果a整個陣列中的鍵匹配,我想合并鍵值。
const array = [
{a: 1, b: ['Foo']},
{a: 1, b: ['Bar']},
{a: 1, b: ['Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
]
進入
const array = [
{a: 1, b: ['Foo','Bar','Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
]
有辦法嗎?任何幫助,將不勝感激!
編輯 1:我在這里缺少的是獲取所有相似密鑰的邏輯a
uj5u.com熱心網友回復:
用于reduce迭代物件陣列以創建一個物件,其中鍵與物件的a值匹配,將各種b值添加到它們的陣列中。然后用于Object.values創建一個新陣列。
const arr = [
{a: 1, b: ['Foo']},
{a: 1, b: ['Bar']},
{a: 1, b: ['Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
];
// For each iteration pass in the accumulator
// and the current object
const out = arr.reduce((acc, c) => {
// Assign the value of `a` to `key`
const key = c.a;
// If the key doesn't exist on the accumulator
// set a new object
acc[key] = acc[key] || { a: key, b: [] };
// And then push the first element of `b`
// into the object's array
acc[key].b.push(c.b[0]);
// Return the accumulator
return acc;
}, {});
// And then finally get the Object.values from
// your returned object to make an array
console.log(Object.values(out));
uj5u.com熱心網友回復:
你可以使用reduce它
首先,您創建一個值為aas 鍵的物件,然后將所有物件分組b為相同的a
然后你只需使用洗掉物件鍵Object.values
const array = [
{a: 1, b: ['Foo']},
{a: 1, b: ['Bar']},
{a: 1, b: ['Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
]
const grouped = Object.values(array.reduce(
(res, {a, b}) => {
const existing = res[a] || {b: []}
return {
...res,
[a]: {a, b: [...existing.b, ...b]}
}
}, {}
))
console.log(grouped)
uj5u.com熱心網友回復:
使用 reduce 您可以合并 b 的值并創建一個新陣列。
const array = [
{a: 1, b: ['Foo']},
{a: 1, b: ['Bar']},
{a: 1, b: ['Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
];
const result = array.reduce((t, { a, b }, _, arr) => {
if (t.some(v => v.a === a))
return t; // if a is already handled, skip
return [
...t,
{
a,
b: arr
.filter(v => v.a === a) // filter out items with different "a" value
.reduce((t, v) => [...t, ...v.b], []), // merge the values of "b"
}
];
}, []);
console.log(result);
uj5u.com熱心網友回復:
在這里我Set用來確保沒有重復的值。最后map它回到一個陣列。
const array = [
{a: 1, b: ['Foo']},
{a: 1, b: ['Bar']},
{a: 1, b: ['Baz']},
{a: 2, b: ['Foo']},
{a: 3, b: ['Foo']},
]
const o = array.reduce((acc, obj) => {
if(!(acc[obj?.a] instanceof Set))
acc[obj.a] = new Set()
acc[obj.a].add(obj.b)
return acc
}, {})
const result = Object.entries(o).map(([a, b]) => ({a, b: Array.from(b) }))
console.log(result)
uj5u.com熱心網友回復:
使用 JavaScriptMap
const array = [
{ a: 1, b: ["Foo"] },
{ a: 1, b: ["Bar"] },
{ a: 1, b: ["Baz"] },
{ a: 2, b: ["Foo"] },
{ a: 3, b: ["Foo"] },
];
const grouped = Array.from(
array
.reduce((m, o) => {
if (m.has(o.a)) {
const currObj = m.get(o.a);
m.set(o.a, { ...currObj, b: [...currObj.b, ...o.b] });
} else {
m.set(o.a, o);
}
return m;
}, new Map())
.values()
);
console.log(grouped);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463740.html
標籤:javascript
