代码之家  ›  专栏  ›  技术社区  ›  Ankit Agarwal

获取一个包含数组中所有对象键的数组

  •  1
  • Ankit Agarwal  · 技术社区  · 6 年前

    所以,我得到的是这样一个数组:

    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() 对数组执行操作,但我无法获取。

    4 回复  |  直到 6 年前
        1
  •  2
  •   Nikhil Aggarwal    6 年前

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

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

    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
  •  1
  •   Nina Scholz    6 年前

    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; }
        3
  •  0
  •   Jimish Fotariya    6 年前

    // 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]) ) )
        4
  •  0
  •   Nishant Dongare    6 年前

    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)));