【问题标题】:How to get keys and sub keys from the array of object?如何从对象数组中获取键和子键?
【发布时间】:2020-08-28 04:51:10
【问题描述】:

我有以下对象数组。

const array = [{
  field1: "val1",
  field2: "val2",
  field3: {
    field1: "val1",
    field2: "val2"
  }
},
{
  field1: "val1",
  field2: "val2",
  field3: {
    field1: "val1"
  }
}]

我需要低于输出

const output = [{
  key: "field1",
  subkeys: []
},
{
  key: "field2",
  subkeys: []
},
{
  key: "field3",
  subkeys: ["field1", "field2"]
}]

我可以使用这个获得顶级字段

const keys = array.map(x => Object.keys(x)[0]);

但无法访问内部的。

请帮助...谢谢!!!

【问题讨论】:

  • 你只有两层对象吗?
  • @DarkKnight: 是你预期的输出const output = [[{key: "field1", subkeys: [] }, {key: "field2", subkeys: [] }, {key: "field3", subkeys: ["field1", "field2"] }], [{key: "field1", subkeys: [] }, {key: "field2", subkeys: [] }, {key: "field3", subkeys: ["field1"] }]] 也就是数组数组吗?或者问题中提到的那个
  • @DhivyaDandapani 如问题所述。不是数组数组
  • @DarkKnight:谢谢。但是到目前为止选择的答案似乎并没有返回预期的答案。您还在寻找准确的答案吗?
  • @DarkKnight:您能否也发布一个多级嵌套 json 的示例输入输出?我发布了一个答案。我可以根据您的要求修改它

标签: javascript arrays dictionary object


【解决方案1】:

此解决方案使用 lodash 库。我已经提取了变量以获得更好的可读性。此解决方案适用于 2 个级别

const array = [
    {"field1":"val1","field2":"val2","field3":{"field1":"val1","field2":"val2"}},
    {"field1":"val1","field2":"val2","field3":{"field1":"val1","field4":"val1"}}
];

intermediateOutput = array.reduce(
  (accumulator, entry) => _.merge(accumulator, entry),
{});
// intermediateOutput = {"field1":"val1","field2":"val2","field3":{"field1":"val1","field2":"val2","field4":"val1"}}

const finalOutput = _.map(_.keys(intermediateOutput), (key) => {
  const value = intermediateOutput[key];
  return {key, subkeys: _.isObject(value) ? _.keys(value): [] }
})

console.log(finalOutput);
// finalOutput = [{"key":"field1","subkeys":[]},{"key":"field2","subkeys":[]},{"key":"field3","subkeys":["field1","field2","field4"]}]

【讨论】:

  • 实际上我有这个对象数组lodashfiddle.herokuapp.com/ka6dpidr....我需要这个键,但有空白字符串。
  • @DarkKnight:感谢 lodashfiddle。小提琴中发布的数组似乎格式不正确。此外,如果您还提到 lodashfiddle 中发布的数组的预期输出作为评论,这将有所帮助。
【解决方案2】:

您可以通过查看嵌套对象来映射任何深度。

const
    getKeys = object => Object.keys(object).map(key => ({ 
        key, 
        subkeys: object[key] && typeof object[key] === 'object'
            ? getKeys(object[key])
            : []
    })),
    array = [{ field1: "val1", field2: "val2", field3: { field1: "val1", field2: "val2" } }, { field1: "val1", field2: "val2", field3: { field1: "val1" } }];

console.log(array.map(getKeys));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:
    const output = []
    for (let [key, value] of Object.entries(array)) {
        const subkeys = Object.keys(value)
        output.push({key, subkeys})
    }
    

    类似的东西?

    【讨论】:

      【解决方案4】:

      您可以在顶层减少对象键数组,然后检查此键的值是否为对象 - 检索其嵌套键,否则只需保留子键的空数组

      const array = [{
        field1: "val1",
        field2: "val2",
        field3: {
          field1: "val1",
          field2: "val2"
        }
      },
      {
        field1: "val1",
        field2: "val2",
        field3: {
          field1: "val1"
        }
      }]
      
      const result = array.map(item => {
        return Object.keys(item).reduce((acc, rec) => {
          if(typeof item[rec] === 'object') {
            return [...acc, {key: rec, subkeys: Object.keys(item[rec])}] 
          }
          return [...acc, {key: rec, subkeys: []}]
        }, [])
      })
      
      console.log(result)

      【讨论】:

      • 只是一个小问题......可以为未知级别完成吗?
      • @DarkKnight 对于未知级别函数应该是递归的。 reduce 应该写成一个函数,并且在 typeof new child 是 object 的条件下 - 只需运行递归
      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多