【问题标题】:Get the key of a nested object获取嵌套对象的键
【发布时间】:2020-02-24 15:50:35
【问题描述】:

我需要一个简单的方法来获取嵌套对象的键,例如description。这是我的结构:

let data = [
  {
    name: "Apple",
    id: 1,
    alt: [{ name: "fruit1", description: "tbd1" }]
  },
  {
    name: "Banana",
    id: 2,
    alt: [{ name: "fruit2", description: "tbd2" }]
  },
  {
    name: "Blueberry",
    id: 3,
    alt: [{ name: "fruit3", description: "tbd3" }]
  }
];

【问题讨论】:

  • 到目前为止您尝试过什么?什么是期望的输出?请贴出相关代码
  • 在这种特殊情况下,Object.keys(data[0].alt[0])["name", "description"],并且无法保证该键数组的顺序。如果您想问如何获得 valuedata[0].alt[0].descriptiontbd1
  • 获取key还是value?
  • 你想要一个键还是想要数组中的所有描述?

标签: javascript reactjs


【解决方案1】:

您可以使用Object.keys(x) 列出任意对象的键。关于嵌套,这只是知道您希望列出哪些嵌套索引并提供它的情况。

您可能需要考虑类似this

【讨论】:

  • 这不会给他太多,因为从“Object.keys”返回的数组中键的顺序并不一致。你可以运行几次,每次得到不同的排序。
【解决方案2】:

获取嵌套对象的键:

Object.keys(data[0].alt[0]) => 导致字符串数组 ["name","description"] - 不一定按此顺序。

获取描述键的值:

data[0].alt[0].description => 产生tbd1 字符串。

获取所有描述的数组:

data.map(obj => obj.alt[0].description).

不知道你的意思,所以给了你我能想到的所有选项。

【讨论】:

    【解决方案3】:

    如果你想要键,包括嵌套键,你可以像这样递归遍历数组/对象。

    有两个可选参数允许您:

    • 忽略数组部分,即skipArrays
    • 是否保留父对象键,即keepObjKeys

    const isObject = (obj) => obj != null && obj.constructor.name === "Object";
    
    let data = [
      { name: "Apple",     id: 1, alt: [{ name: "fruit1", description: "tbd1" }] },
      { name: "Banana",    id: 2, alt: [{ name: "fruit2", description: "tbd2" }] },
      { name: "Blueberry", id: 3, alt: [{ name: "fruit3", description: "tbd3" }] }
    ];
    
    console.log(getKeys(data, false, false));
    console.log(getKeys(data, true, true));
    
    function getKeys(obj, keepObjKeys, skipArrays, keys=[], scope=[]) {
      if (Array.isArray(obj)) {
        if (!skipArrays) scope.push('[' + obj.length + ']');
        obj.forEach((o) => getKeys(o, keepObjKeys, skipArrays, keys, scope), keys);
      } else if (isObject(obj)) {
        Object.keys(obj).forEach((k) => {
          if ((!Array.isArray(obj[k]) && !isObject(obj[k])) || keepObjKeys) {
            let path = scope.concat(k).join('.').replace(/\.\[/g, '[');
            if (!keys.includes(path)) keys.push(path);
          }
          getKeys(obj[k], keepObjKeys, skipArrays, keys, scope.concat(k));
        }, keys);
      }
      return keys;
    }
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

      【解决方案4】:

      可以帮到你

      let keys = Object.keys(yourObject);
      

      keys 数组包含名称、描述

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        相关资源
        最近更新 更多