如果满足条件,则从对象数组中获取Object

时间:2018-06-17 08:40:35

标签: javascript ecmascript-6

我有一个来自外部api的'非常大的对象'。我希望通过用户提供的值获取对象库的id,在这种情况下,类别的id'这是包含两个对象的简化内容

 { 
  "6":{  
  "id":2045,
  "categories":[  
     {  
        "id":7,
        "name":"Day Trips & Excursions Outside the City"
     },
     {  
        "id":34,
        "name":"Day-Tour"
     },
     {  
        "id":8,
        "name":"Food, Wine & Gastronomy"
     }
   ],
  },
 "8":{  
  "id":20456,
  "categories":[  
     {  
        "id":17,
        "name":"Day Trips & Excursions Outside the City"
     },
     {  
        "id":2,
        "name":"Day-Tour"
     },
     {  
        "id":8,
        "name":"Food, Wine & Gastronomy"
     }
  ],
 },
},

在这个例子中,我想得到对象的id,例如id:2045,如果其中一个类别id与用户提供的id匹配。因此,例如用户提供8,它应该返回ID为20145和20456的id,如果用户提供了17,则应该返回20456的id。

我试过

   const acti = activitiesbigobjct.filter((e) => e.categories);

但我得错误过滤器不是函数错误

我试过像

这样的东西
    for(const [key, value] of Object.entries(activitiesbigobj)) {
          console.log(value)
     }

但我认为它不是最佳解决方案,任何想法?

4 个答案:

答案 0 :(得分:0)

如果您只需要这些值,只需使用Object.values

Object.values(activitiesbigobjct).filter((e) => e.categories.some(id => id === 8)).map(e => e.id);

答案 1 :(得分:0)

您可以使用Object.keys()Array.forEach()

var obj = { "6": { id: 2045, categories: [{ id: 7, name: "Day Trips & Excursions Outside the City" }, { id: 34, name: "Day-Tour" }, { id: 8, name: "Food, Wine & Gastronomy" }] }, "8": { id: 20456, categories: [{ id: 17, name: "Day Trips & Excursions Outside the City" }, { id: 2, name: "Day-Tour" }, { id: 8, name: "Food, Wine & Gastronomy" }] }};

var userId = 8;
var result = [];
Object.keys(obj).forEach((key)=>{
  obj[key].categories.forEach((category)=>{
    if(category.id === userId)
        result.push(obj[key].id);
  });

});
console.log(result);

答案 2 :(得分:0)

您可以过滤对象的值并映射id

function getId(subId) {
    return Object
        .values(data)
        .filter(({ categories }) => categories.some(({ id }) => id === subId))
        .map(({ id }) => id)
}

var data = { "6": { id: 2045, categories: [{ id: 7, name: "Day Trips & Excursions Outside the City" }, { id: 34, name: "Day-Tour" }, { id: 8, name: "Food, Wine & Gastronomy" }] }, "8": { id: 20456, categories: [{ id: 17, name: "Day Trips & Excursions Outside the City" }, { id: 2, name: "Day-Tour" }, { id: 8, name: "Food, Wine & Gastronomy" }] } };;

console.log(getId(8));

答案 3 :(得分:0)

您的第一个错误正在发生,因为.filter()是数组上的函数,而您的大对象就是对象。

您可以将大对象放入数组中,然后使用.filter().map()进行首先过滤,然后获取所需的值。

一个简单的例子:

[{ id: 1, name: "a"},{ id: 2, name: "b" }].filter(x => x.id === 2).map(x => x.name) 

将从过滤结果中返回"b" name属性。

如果孩子id匹配,您需要做一些与父母的category不同的事情,例如:

[<your data>].filter(x => x.categories.id === <your id (17)>).map(x => x.id)