Javascript 过滤器嵌套数组

Javascript 过滤器嵌套数组,javascript,Javascript,我正在尝试使用id筛选事件对象。如果其中一个事件具有匹配的类别id,则我希望将其添加到新对象 我正在更新我的原始问题,因为dots属性是一个对象数组。所以下面的答案是行不通的 我有一个基本的 尝试在此处进行筛选: Object.keys(events).dots.categories.filter(category => { category.id === selectedId // remove if matching }); 我只希望筛选对象中有此属性,因为它的类别id为62

我正在尝试使用id筛选事件对象。如果其中一个事件具有匹配的类别id,则我希望将其添加到新对象

我正在更新我的原始问题,因为
dots
属性是一个对象数组。所以下面的答案是行不通的

我有一个基本的

尝试在此处进行筛选:

Object.keys(events).dots.categories.filter(category => {
    category.id === selectedId // remove if matching
});
我只希望筛选对象中有此属性,因为它的类别id为62:

const events = {
  "2018-01-31": {
    dots: [{
      key: "test",
      color: "red",
      categories: [{
        name: "cat 1",
        id: 59
      }, {
        name: "cat 2",
        id: 61
      }, {
        name: "cat 3",
        id: 62
      }]
    }]
  }

您可以通过检查内部数组是否具有想要的
id
来过滤对象的键

然后用给定的键构建一个新对象

var selectedId=62,
filteredEvents={},
事件={“2018-01-31”:{点:{键:“测试”,颜色:“红色”,类别:{名称:“第一类”,id:59},{名称:“第二类”,id:61},{名称:“第三类”,id:62}}},},“2018-02-02”:{点:{键:“测试1”,颜色:“蓝色”,类别:[{名称:“第一类”,id:59}}},},{点:{键:“测试2”,颜色:“粉色”,类别:{名称:“第一类”,id:59}]}}};
分配(filteredEvents,…对象)
.keys(事件)
.filter(k=>events[k].dots.categories.some({id}=>id==selectedId))
.map(k=>({[k]:事件[k]}))
);
console.log(filteredEvents)

.as console wrapper{max height:100%!important;top:0;}
您可以通过检查内部数组是否具有所需的
id来筛选对象的键

然后用给定的键构建一个新对象

var selectedId=62,
filteredEvents={},
事件={“2018-01-31”:{点:{键:“测试”,颜色:“红色”,类别:{名称:“第一类”,id:59},{名称:“第二类”,id:61},{名称:“第三类”,id:62}}},},“2018-02-02”:{点:{键:“测试1”,颜色:“蓝色”,类别:[{名称:“第一类”,id:59}}},},{点:{键:“测试2”,颜色:“粉色”,类别:{名称:“第一类”,id:59}]}}};
分配(filteredEvents,…对象)
.keys(事件)
.filter(k=>events[k].dots.categories.some({id}=>id==selectedId))
.map(k=>({[k]:事件[k]}))
);
console.log(filteredEvents)

。作为控制台包装{max height:100%!important;top:0;}
您可以使用
reduce
构建新对象

// Get the key for each event
let result = Object.keys(events).reduce((result, key) => {
    // Check if the categories contain a matching ID
    if (events[key].dots.categories.some(cat => cat.id === selectedId)) {
        // Add it to the results
        result[key] = events[key];
    }
    return result;
}, {});
以下是一个工作片段:

const selectedId=62;
常量filteredEvents={};
常量事件={
"2018-01-31": {
圆点:{
键:“测试”,
颜色:“红色”,
类别:[{
名称:“第一类”,
身份证号码:59
}, {
名称:“第2类”,
身份证号码:61
}, {
名称:“第三类”,
身份证号码:62
}]
}
},
"2018-02-02": {
圆点:{
键:“测试1”,
颜色:“蓝色”,
类别:[{
名称:“第一类”,
身份证号码:59
}]
}
},
"2018-02-04": {
圆点:{
键:“测试2”,
颜色:“粉色”,
类别:[{
名称:“第一类”,
身份证号码:59
}]
}
}
};
让结果=对象。键(事件)。减少((结果,键)=>{
if(事件[key].dots.categories.some(cat=>cat.id==selectedId)){
结果[键]=事件[键];
}
返回结果;
}, {});

控制台日志(结果)您可以使用
reduce
构建新对象

// Get the key for each event
let result = Object.keys(events).reduce((result, key) => {
    // Check if the categories contain a matching ID
    if (events[key].dots.categories.some(cat => cat.id === selectedId)) {
        // Add it to the results
        result[key] = events[key];
    }
    return result;
}, {});
以下是一个工作片段:

const selectedId=62;
常量filteredEvents={};
常量事件={
"2018-01-31": {
圆点:{
键:“测试”,
颜色:“红色”,
类别:[{
名称:“第一类”,
身份证号码:59
}, {
名称:“第2类”,
身份证号码:61
}, {
名称:“第三类”,
身份证号码:62
}]
}
},
"2018-02-02": {
圆点:{
键:“测试1”,
颜色:“蓝色”,
类别:[{
名称:“第一类”,
身份证号码:59
}]
}
},
"2018-02-04": {
圆点:{
键:“测试2”,
颜色:“粉色”,
类别:[{
名称:“第一类”,
身份证号码:59
}]
}
}
};
让结果=对象。键(事件)。减少((结果,键)=>{
if(事件[key].dots.categories.some(cat=>cat.id==selectedId)){
结果[键]=事件[键];
}
返回结果;
}, {});

控制台日志(结果)
您可以使用
Object.values()
将对象转换为值数组,
.find()
id
等于
selectedId

const results = Object.values(events).filter(({dots:{categories}}) => 
    categories.find(({id}) => id === selectedId)
).pop();

您可以使用
Object.values()
将对象转换为值数组,
.find()
获取id等于
selectedId的对象

const results = Object.values(events).filter(({dots:{categories}}) => 
    categories.find(({id}) => id === selectedId)
).pop();

为什么要投否决票?我已经提供了代码和小提琴。请添加想要的结果以及不知道为什么。你也可以添加你想要的结果吗?现在还不清楚你想要的是一系列事件,还是一系列类别。否决票可能是因为你的实际问题似乎不存在。你到底在问什么?输入/输出应该是什么样子?试着打开控制台并打开。你显然有错误,为什么投否决票?我已经提供了代码和小提琴。请添加想要的结果以及不知道为什么。你也可以添加你想要的结果吗?现在还不清楚你想要的是一系列事件,还是一系列类别。否决票可能是因为你的实际问题似乎不存在。你到底在问什么?输入/输出应该是什么样子?试着打开控制台并打开。你显然有错误。
实际上是一组对象(事件)。上面的示例如何处理对象数组?
dots
实际上是一个对象数组(事件)。上面的示例如何处理对象数组?