当我使用输入类型id(是唯一的)时,我需要返回带有类别和类型的字符串,我已经完成了很多工作,但是我无法获取根类别。 我的解决方案返回'Terrace',但我需要'Rural / Terrace'。
我认为我的事情过于复杂
let obj =[
{
category: 'Residential',
category_id: 1,
types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]
},
{
category: 'Commercial',
category_id: 2,
types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]
},
{
category: 'Rural',
category_id: 3,
types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]
}
];
console.log(obj.map(o=>o.types).reduce((acc, val) => acc.concat(val), []).find(inner_obj=>inner_obj.id==15).name);
答案 0 :(得分:1)
我可能会尝试这样的事情。使用reduce()
浏览主要项目,然后使用find()
查看是否有匹配的项目。如果是这样,请将您需要的内容推送到阵列。
let obj =[{category: 'Residential',category_id: 1,types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]}, {category: 'Commercial',category_id: 2,types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]},{category: 'Rural',category_id: 3,types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]}];
let found = obj.reduce((a, c) => {
let found = c.types.find(t => t.id === 15)
if (found) a.push({category: c.category, name:found.name})
return a
}, [])
console.log(found)

如果有多个项目id===15
,我可能会返回多个项目。在这种情况下,不清楚应该发生什么,但是返回它们似乎都是合理的。
编辑:如果你知道id是唯一的
如果你知道每个id
只有一个,你可以提前退出,这可能会节省大量搜索的时间:
let obj =[{category: 'Residential',category_id: 1,types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]}, {category: 'Commercial',category_id: 2,types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]},{category: 'Rural',category_id: 3,types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]}];
function find(id, obj) {
for (prop of obj){
let found = prop.types.find(t => t.id === id)
if (found) return [prop.category, found.name]
}
}
console.log(find(15, obj))

答案 1 :(得分:1)
为什么不是这样简单的东西?
let obj = [{ category: 'Residential', category_id: 1, types: [{ name: 'House', id: 1 }, { name: 'Townhouse / Villa', id: 3 }, { name: 'House and Land', id: 5 }, { name: 'Duplex', id: 4 }, { name: 'Land', id: 6 }, { name: 'Terrace', id: 16 }, { name: 'Apartment/Unit', id: 2 }, { name: 'Relocatable', id: 7 }] }, { category: 'Commercial', category_id: 2, types: [{ name: 'Office', id: 12 }, { name: 'House', id: 8 }, { name: 'Land', id: 9 }, { name: 'Shop', id: 10 }, { name: 'Factory', id: 11 }] }, { category: 'Rural', category_id: 3, types: [{ name: 'House', id: 17 }, { name: 'House and Land', id: 14 }, { name: 'Land', id: 13 }, { name: 'Terrace', id: 15 }] } ];
for (let elem of obj) {
const typeFound = elem.types.find(type => type.id === 15);
if (typeFound) {
console.log(elem.category + " " + typeFound.name);
break;
}
}
答案 2 :(得分:0)
这是一种方法。首先,将可能的结果展平为像[{id: 15, name: "Rural / Terrace"}, ...]
这样的结果数组,然后找到您想要的特定元素。
let obj =[
{
category: 'Residential',
category_id: 1,
types: [{name: 'House', id: 1},{name: 'Townhouse / Villa', id: 3},{name: 'House and Land', id: 5},{name: 'Duplex', id: 4},{name: 'Land', id: 6},{name: 'Terrace', id: 16},{name: 'Apartment/Unit', id: 2},{name: 'Relocatable', id: 7}]
},
{
category: 'Commercial',
category_id: 2,
types: [{name: 'Office', id: 12},{name: 'House', id: 8},{name: 'Land', id: 9},{name: 'Shop', id: 10},{name: 'Factory', id: 11}]
},
{
category: 'Rural',
category_id: 3,
types: [{name: 'House', id: 17},{name: 'House and Land', id: 14},{name: 'Land', id: 13},{name: 'Terrace', id: 15}]
}
];
const flatTypes = obj.map(cat =>
cat.types.map(type => {
return {
id: type.id,
name: `${cat.category} / ${type.name}`
};
})
).reduce((flatTypes, typeArray) =>
flatTypes.concat(typeArray)
, []);
const result = flatTypes.find(type => type.id === 15).name;
console.log(result);