【问题标题】:Get an array with all the keys of the objects inside the array获取一个数组,其中包含数组内对象的所有键
【发布时间】:2019-01-20 23:06:25
【问题描述】:

我一直想递归遍历数组中的所有对象并在数组数据结构中获取这些对象的键。我知道如何循环并获取对象的键。但这里的问题是我需要递归地处理灵活的对象。灵活是指它可以具有任何级别的嵌套属性。

所以,我有一个这样的数组:

let record = [{
    "province": "string",
    "city": "string",
    "type": "alternative_address",
    "address_line1": "string",
    "post_code": "5858"
  },
  {
    "province": "string",
    "city": "string",
    "type": "alternative_address",
    "post_code": "5858",
    "embedeer": {
      "veryEmbedded": {
        "veryveryEmbeded": 'yes'
      }
    }
  }
];

通过一些计算,我期望得到如下输出:

['province','city','type','address_line1','post_code','embedeer', 'embedeer.veryEmbedded', 'embedeer.veryEmbedded.veryveryEmbeded'];

对于我在这方面的努力,我在数组上使用了reduce() 操作,但我无法做到。

【问题讨论】:

    标签: javascript jquery arrays node.js ecmascript-6


    【解决方案1】:

    您需要编写一个接受 2 个输入的递归函数

    • 对象
    • 前缀(一级键未定义)

    let record = [{"province":"string","city":"string","type":"alternative_address","address_line1":"string","post_code":"5858"},{"province":"string","city":"string","type":"alternative_address","post_code":"5858","embedeer":{"veryEmbedded":{"veryveryEmbeded":"yes"}}}];
    
    function addKeysToSet(o, p) {
      Object.keys(o).forEach(k => {
        let key = p ? p + "." + k : k; // Create the key hierarchy
        keys.add(key); // Add key to the set 
        // If the value is an object, call the function recursively 
        if(typeof o[k] === 'object') {
          addKeysToSet(o[k], key);
        }
      });
    }
    
    let keys = new Set(); // Create set of unique keys
    // For each object in array, call function that adds keys to the set
    record.forEach(o => addKeysToSet(o));
    let result = Array.from(keys); // Create array from set
    console.log(result); // logs result

    【讨论】:

      【解决方案2】:

      您可以将对象展平,然后获取键。

      // form https://gist.github.com/penguinboy/762197
      
      let record = [{"province":"string","city":"string","type":"alternative_address","address_line1":"string","post_code":"5858"},{"province":"string","city":"string","type":"alternative_address","post_code":"5858","embedeer":{"veryEmbedded":{"veryveryEmbeded":"yes"}}}];
      
      var flattenObject = function(a) {
        var b = {};
        for (var c in a)
          if (a.hasOwnProperty(c))
            if ("object" == typeof a[c]) {
              var d = flattenObject(a[c]);
              for (var e in d) d.hasOwnProperty(e) && (b[c + "." + e] = d[e]);
            } else b[c] = a[c];
        return b;
      };
      
      console.log(flattenObject(record) )
      
      /*
       It is also taking care of index numbers of the array. ("0.province" instead of "province" If multiple entries are passed)  
       
       */
      console.info( "All keys", Object.keys(flattenObject(record) ) )
      
      // Simple
      console.info( "keys", Object.keys(flattenObject(record[1]) ) )

      【讨论】:

        【解决方案3】:

        您可以采用迭代和递归方法,并利用 Set 的强大功能获取唯一值。

        function iter(object, keys) {
            return Object
                .entries(object)
                .reduce((r, [k, v]) => r.concat(keys.concat(k).join('.'), v && typeof v === 'object'
                    ? iter(v, keys.concat(k))
                    : []
                ), []);        
        }
        
        var record = [{ province: "string", city: "string", type: "alternative_address", address_line1: "string", post_code: "5858" }, { province: "string", city: "string", type: "alternative_address", post_code: "5858", embedeer: { veryEmbedded: { veryveryEmbeded: 'yes' } } }],
            keys = [...record.reduce((s, o) => iter(o, []).reduce((t, v) => t.add(v), s), new Set)];
        
        console.log(keys);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

        • 感谢妮娜的回答。我总是喜欢你的回答。它们对学习非常有用。但我使用了上一个答案中的那个。 :)
        【解决方案4】:

        var record1 = [{"province": "string","city": "string","type": "alternative_address","address_line1": "string","post_code": "5858" },
          { "province": "string","city": "string",
            "type": "alternative_address",
            "post_code": "5858",
            "embedeer": {
              "veryEmbedded": {
                "veryveryEmbeded": 'yes'
              }
            }
          }
        ];
        
        var output = [];
        function getAllKeys(obj,precedor="") {
          var temp = Object.entries(obj);
          temp.forEach((el) => 
                       typeof el[1] == "object" ? ( output.push(el[0]),getAllKeys(el[1],precedor==""? el[0]: precedor+"."+el[0])): output.push(precedor==""? el[0]: precedor+"."+el[0]));
        }
         record1.forEach((el,i) => getAllKeys(el,""));
        //To avoid duplicate entries convert array to object.
        console.log(...(new Set(output)));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-24
          • 2010-11-18
          • 1970-01-01
          • 2022-07-16
          • 1970-01-01
          • 2014-07-29
          • 2019-11-04
          相关资源
          最近更新 更多