我如何获取存储在数组中的对象的键

时间:2020-01-17 23:10:29

标签: javascript arrays node.js

让我们为主持人添加前缀,这个问题与嵌套Key无关。这是关于对象中的数组,以及如何查看它是仅包含值的简单数组还是包含对象的数组以及如何获取这些对象的键。我包含了一些代码片段,它们解析了样本并检测了2个数组。我正在寻找的是,如果数组是仅包含值列表的简单数组,则仅返回数组名称。如果数组是对象数组,我想在数组中获取该对象的键。

obj = {
            DocId: "email_campaign::3ed76589-4063-49f6-a21e-9ca16981d102",
            history: {
                created_by: "",
                created_on: "",
                update_on: "",
                updated_by: ""
            },
            librarys :[{id: 1, name : 'Lib 1'},{ id: 2, name: 'Lib 2'}],
            status: "Active",
            subject: "Test 1 Subject",
            summary: "",
            tags: ['one', 'two'],
            template_id: ""
        };

const keyify = (obj, prefix = '') => 
  Object.keys(obj).reduce((res, el) => {
    if( Array.isArray(obj[el]) ) {
      // Here needs to go the Array Part
      console.log(el + ' is Array')
      return [...res, el];
    } else if( typeof obj[el] === 'object' && obj[el] !== null ) {
      return [...res, ...keyify(obj[el], prefix + el + '.')];
    } else {
      return [...res, el];
    }
  }, []);
  
  
const output = keyify(obj);

console.log(output);

2 个答案:

答案 0 :(得分:1)

您可以在数组上使用.every()来检查是否符合条件。

要检查数组,可以使用Array.isArray()。 要检查对象,可以使用typeof variable === 'object',但是数组也被归类为对象类型,因此您需要使用上述方法检查它是否也不是数组。

使用案例示例

const isObject = (arrayItem) => {
  if (typeof arrayItem === 'object' && !Array.isArray(arrayItem) && arrayItem !== null) {
    return true;
  }
  return false;
}

const array1 = [
  [1, 2],
  [1, 2],
  [1, 2]
];
const array2 = [{
  key: 'value'
}, {
  key2: 'value'
}];

console.log('array1', array1.every(isObject)); // false
console.log('array2', array2.every(isObject)); // true

答案 1 :(得分:1)

假设您希望数组名称的前缀与对象的现有前缀相似,则可以尝试以下操作:

const keyify = (obj, prefix = "") =>
  Object.keys(obj).reduce((res, el) => {
    const elDisplayName = `${prefix}${el}`;
    if (Array.isArray(obj[el])) {
      const objectsInArray = obj[el].filter(el => typeof el === "object");
      if (objectsInArray.length > 0) {
        let objectKeys = [];
        objectsInArray.map(object => {
          objectKeys = objectKeys.concat(keyify(object, prefix + el + "."))
        });
        return [...res, ...new Set(objectKeys)];   
      }
      return [...res, elDisplayName];
    } else if (typeof obj[el] === "object" && obj[el] !== null) {
      return [...res, ...keyify(obj[el], prefix + el + ".")];
    } else {
      return [...res, elDisplayName];
    }
  }, []);

此解决方案有许多警告,例如假设数组只有一个对象,则它将仅包含对象。但这应该可以让您开始检测数组中对象的存在。