JavaScript:如何过滤嵌套对象的数组?

时间:2020-08-03 20:56:08

标签: javascript arrays

我有一个像这样的数组

const arr = [
  {
    id: '123',
    book: {isNew: true}
  },
  {
    id: '123',
    book: {isNew: false}
  },
  {
    id: '123',
    book: {isNew: false}
  },
  {
    id: '123',
    book: {isNew: true}
  },
]

我正在尝试过滤数组以仅返回book对象具有isNew为true的对象。

我正在尝试这样的事情

arr.filter(obj => {
  // Use a forEach to determine which book obj is new
}

但是forEach不能返回任何值。

编辑

似乎缺少我最初的解释方式。

在数组的每个obj中,可以有多个“ Book”对象。全部带有动态键。我希望该对象具有至少一个新的“ 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},
  },
]

所以我过滤后的数组将由原始数组的第一个和最后一个元素组成

1 个答案:

答案 0 :(得分:1)

那样的事情

arr.filter(({ book: { isNew } }) => isNew)

我只是使用数据结构来获取 isNew 属性并仅返回TRUE值

UPDATE:

({书:{isNew}}} 只是另一种书写方式

arr.filter((object) => object.book.isNew)

UPDATE:

问题是关于动态[键],我提供了2个解决方案 1-

arr.filter((item) => {
  for (const key of Object.keys(item)) {
    const { isNew } = item[key]
    if (typeof isNew === 'boolean') return isNew
  }
})

我要过滤和循环每个键,并检查是否有一个带有键[isNew]的属性
如果有的话会退还

另一种编写方式

arr.filter((item) => {
  for (const key of Object.keys(item))
    if (item[key].hasOwnProperty('isNew')) return item[key].isNew
})