有没有办法将所有键都包含在一个对象(包括子对象)中?

时间:2019-05-14 15:50:55

标签: javascript object

当前,我正在尝试获取对象的所有键,包括子对象。

我知道

Object.keys(obj)

返回对象的键,但不返回对象内部的键。

例如,我得到了以下对象:

let exampleObject = 
{
   a: "value",
   b: "value",
   c: 404,
   d: {
      e: "value",
      f: "value"
   }
}

注意: d 键可能会更改其名称,因此使用 Object.keys(obj.d)之类的键将无效。 em>。

如何在对象内存在的总键列表中获取 e f

2 个答案:

答案 0 :(得分:4)

您可以使用flatMap递归地获取这样的密钥:

let exampleObject={a:"value",b:"value",c:404,d:{e:"value",f:"value"}};

const getKeys = obj => Object.keys(obj).flatMap(k => Object(obj[k]) === obj[k] 
                                                        ? [k, ...getKeys(obj[k])] 
                                                        : k)

console.log(getKeys(exampleObject))

如果不支持flatMap,请像这样使用reduce

function getKeys(obj) {
  return Object.keys(obj).reduce((r, k) => {
    r.push(k);

    if(Object(obj[k]) === obj[k])
      r.push(...getKeys(obj[k]));

    return r;
  }, [])
}

Object(obj[k]) === obj[k]检查该属性是否是对象,而不是null。因为typeof null === "object"

答案 1 :(得分:2)

您可以尝试使用递归。

  • 创建包装函数getAllKeys(),并在其中创建一个空数组。
  • 现在创建另一个函数getKeys(),该函数接受对象并将被递归调用。
  • getKeys()内部,使用for..in遍历键。
  • push()将该键放入包装函数中创建的空数组中。
  • 检查typeof键是否为"object",然后对此进行递归调用。

let exampleObject = 
{
   a: "value",
   b: "value",
   c: 404,
   d: {
      e: "value",
      f: "value"
   }
}

function getAllKeys(obj){
  let res = []
  function getKeys(obj){
    for(let key in obj){
      res.push(key);
      if(typeof obj[key] === "object"){
        getKeys(obj[key])
      }
      
    }
  }
  getKeys(obj);
  return res;
}
console.log(getAllKeys(exampleObject))