如何在JavaScript中过滤嵌套的嵌套对象?

时间:2019-10-02 20:30:05

标签: javascript arrays filter nested-object

我有这个对象:

{
  value: "something",
  data:  Array[{
     player: "simple name",
     properties: {
        age: "",
        favouriteColour: Array[{
           a: "1", 
           b: "2",
           c: Array[{
              0: "Problem 1",
              1: "Problem 2"
           }],
        },]
     } 
  },{
     player: "simple name",
     properties: {
        age: "",
        favouriteColour: Array[{
           a: "1", 
           b: "2",
           c: Array[{
              1: "Problem 2"
           }],
        },]
     } 
  },
 ]
}

我只想获取值为“问题1”的对象。现在,我在一个带有641个播放器对象的数组中拥有此结构,要检查该结构,并且只带“问题1”。

2 个答案:

答案 0 :(得分:1)

为该问题添加了解决方案,您高度依赖于数据结构,如果更改了该数据,则需要更改解决方案。

const toFilter = {
  value: 'something',
  data: [
    {
      player: 'simple name',
      properties: {
        age: '',
        favouriteColour: [
          {
            a: '1',
            b: '2',
            c: [
              {
                0: 'Problem 1',
                1: 'Problem 2'
              }
            ]
          }
        ]
      }
    },
    {
      player: 'simple name',
      properties: {
        age: '',
        favouriteColour: [
          {
            a: '1',
            b: '2',
            c: [
              {
                1: 'Problem 2'
              }
            ]
          }
        ]
      }
    }
  ]
}

const filtered = toFilter.data.reduce((acc, el) => {
  // hightly dependand on the data structure
  const colors = Object.values(el.properties.favouriteColour[0].c[0])
  const isValid = colors.includes('Problem 1')
  if (isValid) acc.push(el)

  return acc
}, [])

console.log('filtered:', filtered)

答案 1 :(得分:0)

考虑一下。实际上很简单。

我认为这最终将成为JSON结构。考虑到这一点,问题在于,在JSON中,您不能从子级到父级;您只能从父母到孩子向下走。

因此,您实际上只需要遍历数据对象并查看每个播放器对象。对于每个玩家对象,检查properties.favoriteColour是否包含项"Problem 1"。如果是这样,请记下该播放器对象所需的其他属性,或将其完全复制到存储在某个位置,具体取决于您最终想要使用它的方式。