我有一个对象数组。
在数组的每个对象中,可以有多个"Book“对象,每个对象都有动态键。我希望对象至少有一个“书”对象是新的。
例如:
const arr = [
{
id: '123',
book1242: {isNew: true},
book9023: {isNew: false},
},
{
id: '123',
book0374: {isNew: false},
book9423: {isNew: false},
},
{
id: '123',
book8423: {isNew: false},
book9023: {isNew: false},
},
{
id: '123',
book6534: {isNew: true},
book9313: {isNew: false},
},
]因此,我的过滤数组将由原始数组的第一个和最后一个元素组成
期望的过滤数组
const arr = [
{
id: '123',
book1242: {isNew: true},
book9023: {isNew: false},
},
{
id: '123',
book6534: {isNew: true},
book9313: {isNew: false},
},
]我尝试过使用filter和map,但我不得不遍历并检查哪本书是新书,并且不确定如何在过滤器中返回该对象。
发布于 2020-08-04 06:44:02
听起来你想要这样的东西:
arr.filter((o) => Object.values(o).some((b) => b.isNew))
您的阵列是否只有id和bookwxyz密钥?如果不是,您可能需要对这些值进行一些检查,以确保它们不是未定义的
您还可以使用Object.entries和正则表达式显式检查密钥:
arr.filter((o) => Object.entries(o).some(([key, value]) => /book\d{4}/.test(key) && value.isNew))
发布于 2020-08-04 06:45:00
您可以在Object.values中使用Array#some。
const arr = [ { id: '123', book1242: {isNew: true}, book9023: {isNew: false}, }, { id: '123', book0374: {isNew: false}, book9423: {isNew: false}, }, { id: '123', book8423: {isNew: false}, book9023: {isNew: false}, }, { id: '123', book6534: {isNew: true}, book9313: {isNew: false}, }, ];
const res = arr.filter(obj=>Object.values(obj).some(({isNew})=>isNew));
console.log(res);
发布于 2020-08-04 06:51:07
const arr=[{id:"123",book1242:{isNew:!0},book9023:{isNew:!1}},{id:"123",book0374:{isNew:!1},book9423:{isNew:!1}},{id:"123",book8423:{isNew:!1},book9023:{isNew:!1}},{id:"123",book6534:{isNew:!0},book9313:{isNew:!1}}];
const res = arr.filter(obj => {
for(const [key, val] of Object.entries(obj)){
if(key.substring(0,4) === 'book' && val.isNew === true){
return obj
}
}
})
console.log(res)
https://stackoverflow.com/questions/63237869
复制相似问题