如何基于同一id创建词典列表



假设我有以下三个列表:

const data = [
{ id: 1, word: "a", wordId: "05144502" },
{ id: 1, word: "b", wordId: "09309701" },
{ id: 2, word: "c", wordId: "05221504" },
{ id: 2, word: "d", wordId: "05221504" },
];

如何将这三个列表合并为:

[
{
1: [
{ word: "a", wordId: "05144502" },
{ word: "b", wordId: "09309701" },
],
},
{
2: [
{ word: "c", wordId: "05221504" },
{ word: "d", wordId: "05221504" },
],
},
]

实现这一点的最简洁的语法方法是什么?

创建一个新的数组来存放字典,在data上循环,并为每个id添加一个单独的数组中的单词。类似这样的东西:

const data = [
{ id: 1, word: "a", wordId: "05144502" },
{ id: 1, word: "b", wordId: "09309701" },
{ id: 2, word: "c", wordId: "05221504" },
{ id: 2, word: "d", wordId: "05221504" },
];
const dictionary = [];
const idToIndexMap = {};
data.forEach(rec => {
if(idToIndexMap[rec.id] !== undefined) {
dictionary[idToIndexMap[rec.id]][rec.id].push({word: rec.word, wordId: rec.wordId});
} else {
dictionary.push({[rec.id]: [{word: rec.word, wordId: rec.wordId}] });
idToIndexMap[rec.id] = dictionary.length - 1;
}
})
console.log(JSON.stringify(dictionary));

const data = [
{ id: 1, word: 'a', wordId: '05144502' },
{ id: 1, word: 'b', wordId: '09309701' },
{ id: 2, word: 'c', wordId: '05221504' },
{ id: 2, word: 'd', wordId: '05221504' },
];
const dic: { [key: number]: { id: number; word: string; wordId: string }[] } = {};
for (const v of data) {
dic[v.id] = [...(dic[v.id] || []), v];
}

或使用lodash

const data = [
{ id: 1, word: 'a', wordId: '05144502' },
{ id: 1, word: 'b', wordId: '09309701' },
{ id: 2, word: 'c', wordId: '05221504' },
{ id: 2, word: 'd', wordId: '05221504' },
];
const result = _.groupBy(data, 'id');

您可以使用辅助数组来确保您可以轻松地找到项目:

const data = [
{ id: 1, word: "a", wordId: "05144502" },
{ id: 1, word: "b", wordId: "09309701" },
{ id: 2, word: "c", wordId: "05221504" },
{ id: 2, word: "d", wordId: "05221504" },
];
let output = [];
let objects = {};
for (let item of data) {
let obj = {};
for (let key in item) {
if (key !== "id") obj[key] = item[key];
}
if (!objects[item.id]) {
let wrapper = {
[item.id]: [obj]
};
objects[item.id] = wrapper;
output.push(objects[item.id]);
} else {
objects[item.id][item.id].push(obj);
}
}
console.log(output);

最新更新