首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript:如何通过嵌套在object 2 level deep中的值过滤数组

JavaScript:如何通过嵌套在object 2 level deep中的值过滤数组
EN

Stack Overflow用户
提问于 2020-08-04 06:41:10
回答 4查看 352关注 0票数 1

我有一个对象数组。

在数组的每个对象中,可以有多个"Book“对象,每个对象都有动态键。我希望对象至少有一个“书”对象是新的。

例如:

代码语言:javascript
复制
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},
  },
]

因此,我的过滤数组将由原始数组的第一个和最后一个元素组成

期望的过滤数组

代码语言:javascript
复制
const arr = [
  {
    id: '123',
    book1242: {isNew: true},
    book9023: {isNew: false},
  },
  {
    id: '123',
    book6534: {isNew: true},
    book9313: {isNew: false},
  },
]

我尝试过使用filtermap,但我不得不遍历并检查哪本书是新书,并且不确定如何在过滤器中返回该对象。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-04 06:44:02

听起来你想要这样的东西:

arr.filter((o) => Object.values(o).some((b) => b.isNew))

您的阵列是否只有idbookwxyz密钥?如果不是,您可能需要对这些值进行一些检查,以确保它们不是未定义的

您还可以使用Object.entries和正则表达式显式检查密钥:

arr.filter((o) => Object.entries(o).some(([key, value]) => /book\d{4}/.test(key) && value.isNew))

票数 4
EN

Stack Overflow用户

发布于 2020-08-04 06:45:00

您可以在Object.values中使用Array#some

代码语言:javascript
复制
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);

票数 2
EN

Stack Overflow用户

发布于 2020-08-04 06:51:07

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63237869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档