【问题标题】:searching array of complex objects for certain attributes and return array of values在复杂对象数组中搜索某些属性并返回值数组
【发布时间】:2023-01-27 00:55:20
【问题描述】:

我正在尝试搜索一系列复杂对象,并找到我想在平面数组中收集的某些有价值的属性。

我已经尝试了很多方法,但似乎都不起作用。

我有一个这样的数组,我想找到所有的 ccc 值,

let arr = [
        { aaa: { bbb: { ccc: 11 } } },
        { aaa: { bbb: { eee: { ccc: 12 } } } },
        { aaa: { bbb: 101} },
        { },
        { aaa: { bbb: { ccc: 511 } } },
        { aaa: { bbb: { ccc: 77 } } },
        { aaa: 24 },
        { aaa: { bbb: { ccc: {ddd: 11 } } } },
]
 

最新测试我试过这段代码,它不起作用:

function traverse(obj) {
    const objEntries = Object.entries(obj)
    if (objEntries.length === 0) {
        return 0
    } else {
        const [key, value] = objEntries[0]
        if (key === "bbb") {
            const [key, value] = objEntries[0]
            if (key === "ccc" && typeof (value) === "number") {
                return value
            } else if (typeof (value) === "number") {
                return 0
            }
        return traverse(value)
        }
    }
}

let result = [];
let arr = msg.arr;

arr.forEach(a => {
    result.push(traverse(a))
})

msg.payload = result;

我期待一个结果像这样的数组

结果 = [11, 12, 0, 0, 511, 77, 0, 0]

【问题讨论】:

  • 这是在任何特定语言中,如果是,是哪种语言?

标签: arrays object


【解决方案1】:

假设每个对象只有一个键,你可以像这样做一个基本的递归:

let arr = [{
    aaa: {
      bbb: {
        ccc: 11
      }
    }
  },
  {
    aaa: {
      bbb: {
        ccc: 12
      }
    }
  },
  {
    aaa: {
      bbb: 101
    }
  },
  {},
  {
    aaa: {
      bbb: {
        ccc: 511
      }
    }
  },
  {
    aaa: {
      bbb: {
        ccc: 77
      }
    }
  },
  {
    aaa: 24
  },
  {
    aaa: {
      bbb: {
        ccc: {
          ddd: 11
        }
      }
    }
  },
]

let result = []

function traverse(obj) {
  const objEntries = Object.entries(obj)
  if (objEntries.length === 0) {
    return 0
  } else {
    const [key, value] = objEntries[0]
    
    if (key === "ccc" && typeof(value) === "number") {
      return value
    } else if (typeof(value) === "number") {
      return 0
    }

    return traverse(value)
  }
}

arr.forEach(a => {
  result.push(traverse(a))
})

console.log(result)

【讨论】:

  • 这正是我的意思,非常感谢,我什至可以理解函数中发生的事情。 :)
  • @Henkkas 如果它顺便回答了你的问题,你应该接受答案
  • 你是对的,但恐怕这个解决方案对我的项目来说并不完美。事实证明,只有位于“bbb”中的 ccc 属性对我来说是有效值。我尝试改变常规,但没有成功。所以我稍微改变了数组。
猜你喜欢
  • 2013-12-18
  • 2014-08-17
  • 2021-12-12
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多