Если вы хотите сделать функциональный стиль (уменьшение карты), вы можете сделать это следующим образом
const items = [
{ _id: '1', reference: ['abc'] },
{ _id: '2', reference: ['def'] },
{ _id: '3', reference: ['abc'] }
]
// extract references and put them into a single array
const references =
items
.map(x => x.reference)
.reduce((prev, cur) => prev.concat(cur))
// put them in a set to dedupe
const set = new Set(references)
console.log(references)
console.log([...set])
Если вы хотите сделать меньше проходов по данным, а также избежать необходимости в Set
, вы можете это сделать.
const items = [
{ _id: '1', reference: ['abc'] },
{ _id: '2', reference: ['def'] },
{ _id: '3', reference: ['abc'] }
]
const result = Object.keys(items.reduce((obj, {reference}) => {
for (const ref of reference) {
obj[ref] = true
}
return obj;
}, {}))
console.log(result)
Вы также можете обменять выразительность на производительность с полностью императивным подходом ниже.
const items = [
{ _id: '1', reference: ['abc'] },
{ _id: '2', reference: ['def'] },
{ _id: '3', reference: ['abc'] }
];
const occ = {};
const references = [];
for (let i = 0; i < items.length; ++i) {
const refs = items[i].reference;
for (let j = 0; j < refs.length; ++j) {
const ref = refs[j];
if (occ[ref] == null) {
references.push(ref);
occ[ref] = true;
}
}
}
console.log(references)