2 回答
TA贡献1998条经验 获得超6个赞
您有 2 个解决方案。一个假设,所有元数据都将具有匹配的子菜单。其他假设,可能存在没有子菜单匹配的情况。然后排除该公司。
var fav = ["Toyota", "Honda"];
var ToyotaMetadata = ["Sedans"];
var HondaMetadata = ["Suvs"];
const favMap = {
Toyota: ["Sedans"],
Honda: ["Suvs"]
};
var companies = [
{
text: "Toyota",
origin: "Japan",
icon: "icon",
metaData: [
{
text: "Suvs",
models: "4"
},
{
text: "Sedans",
models: "4"
}
]
},
{
text: "Ford",
founder: "Henry Ford",
icon: "icon"
},
{
text: "Honda",
models: "8",
icon: "icon",
metaData: [
{
text: "Suvs",
models: "4"
},
{
text: "Sedans",
models: "4"
}
]
}
];
const merge = function () {
var args = Array.prototype.slice.call(arguments);
return Object.assign.apply({}, args)
}
// Simple
const res2 = companies.reduce((map, comp) => {
if (favMap[comp.text]) {
map.push(merge(comp, { metaData: comp.metaData.filter(x => favMap[comp.text].indexOf(x.text) != -1) }));
}
return map;
}, []);
console.log(JSON.stringify(res2, null, 4));
// Above will fail. if company is without metadata of car model, still match fav
/*
{
text: "Toyota",
origin: "Japan",
icon: "icon",
metaData: [
]
},
*/
// Complex
const res = companies.reduce((map, comp) => {
let index = 0;
if (
favMap[comp.text] &&
comp.metaData.some(x => {
index++;
if (favMap[comp.text].indexOf(x.text) != -1) {
return true;
}
})
) {
map.push(merge(comp, { metaData: [comp.metaData[index - 1]] }));
}
return map;
}, []);
console.log(JSON.stringify(res, null, 4));
TA贡献1864条经验 获得超2个赞
您可以将您的设置定义为一个对象,并.map()用于外部数组和.filter()内部数组:
let metadataConf = { "Toyota": ToyotaMetadata, "Honda": HondaMetadata };
let result = companies.filter(x => x.metaData).map(({metaData, text, ...fields}) => ({
...fields, text, metaData: metaData.filter(x => metadataConf[text].includes(x.text))
}));
var fav = ["Toyota", "Honda"];
var ToyotaMetadata = ["Sedans"];
var HondaMetadata = ["Suvs"]
var companies = [
{
text: "Toyota",
origin: "Japan",
icon: "icon",
metaData: [
{
text: "Suvs",
models: "4"
},
{
text: "Sedans",
models: "4"
}
]
},
{
text: "Ford",
founder: "Henry Ford",
icon: "icon"
},
{
text: "Honda",
models: "8",
icon: "icon",
metaData: [
{
text: "Suvs",
models: "4"
},
{
text: "Sedans",
models: "4"
}
]
}
];
let metadataConf = { "Toyota": ToyotaMetadata, "Honda": HondaMetadata };
let result = companies.filter(x => x.metaData).map(({metaData, text, ...rest}) => ({ ...rest, text, metaData: metaData.filter(x => metadataConf[text].includes(x.text))
}));
console.log(result);
添加回答
举报
