从对象javascript的嵌套数组中查找条目

时间:2018-04-12 22:20:51

标签: javascript arrays ecmascript-6

当我使用输入类型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);

3 个答案:

答案 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);