How to convert an Object {} to an Array [] of key-value pairs in JavaScript

前端 未结 18 2006
名媛妹妹
名媛妹妹 2020-11-22 12:58

I want to convert an object like this:

{\"1\":5,\"2\":7,\"3\":0,\"4\":0,\"5\":0,\"6\":0,\"7\":0,\"8\":0,\"9\":0,\"10\":0,\"11\":0,\"12\":0}

相关标签:
18条回答
  • 2020-11-22 13:28

    The best way is to do:

    var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10"‌​:0,"11":0,"12":0} 
    Object.entries(obj);
    

    Calling entries, as shown here, will return [key, value] pairs, as the asker requested.

    Alternatively, you could call Object.values(obj), which would return only values.

    0 讨论(0)
  • 2020-11-22 13:28

    In Ecmascript 6,

    var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
    
    var res = Object.entries(obj);
    
    console.log(res);
    

    fiddle

    0 讨论(0)
  • 2020-11-22 13:28

    Use Object.keys and Array#map methods.

    var obj = {
      "1": 5,
      "2": 7,
      "3": 0,
      "4": 0,
      "5": 0,
      "6": 0,
      "7": 0,
      "8": 0,
      "9": 0,
      "10": 0,
      "11": 0,
      "12": 0
    };
    // get all object property names
    var res = Object.keys(obj)
      // iterate over them and generate the array
      .map(function(k) {
        // generate the array element 
        return [+k, obj[k]];
      });
    
    console.log(res);

    0 讨论(0)
  • 2020-11-22 13:28

    I would suggest this simplest solution to use Object.entries()

    var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
    var result =Object.entries(obj)
    
    console.log(result);

    0 讨论(0)
  • 2020-11-22 13:29

    Object.entries() returns an array whose elements are arrays corresponding to the enumerable property [key, value] pairs found directly upon object. The ordering of the properties is the same as that given by looping over the property values of the object manually.

    - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description

    The Object.entries function returns almost the exact output you're asking for, except the keys are strings instead of numbers.

    const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
    
    console.log(Object.entries(obj));

    If you need the keys to be numbers, you could map the result to a new array with a callback function that replaces the key in each pair with a number coerced from it.

    const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
    
    const toNumericPairs = input => {
        const entries = Object.entries(input);
        return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
    }
    
    console.log(toNumericPairs(obj));

    I use an arrow function and Object.assign for the map callback in the example above so that I can keep it in one instruction by leveraging the fact that Object.assign returns the object being assigned to, and a single instruction arrow function's return value is the result of the instruction.

    This is equivalent to:

    entry => {
        entry[0] = +entry[0];
        return entry;
    }
    

    As mentioned by @TravisClarke in the comments, the map function could be shortened to:

    entry => [ +entry[0], entry[1] ]
    

    However, that would create a new array for each key-value pair, instead of modifying the existing array in place, hence doubling the amount of key-value pair arrays created. While the original entries array is still accessible, it and its entries will not be garbage collected.

    Now, even though using our in-place method still uses two arrays that hold the key-value pairs (the input and the output arrays), the total number of arrays only changes by one. The input and output arrays aren't actually filled with arrays, but rather references to arrays and those references take up a negligible amount of space in memory.

    • Modifying each key-value pair in-place results in a negligible amount of memory growth, but requires typing a few more characters.
    • Creating a new array for each key-value pair results in doubling the amount of memory required, but requires typing a few less characters.

    You could go one step further and eliminate growth altogether by modifying the entries array in-place instead of mapping it to a new array:

    const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
    
    const toNumericPairs = input => {
      const entries = Object.entries(obj);
      entries.forEach(entry => entry[0] = +entry[0]);
      return entries;
    }
    
    console.log(toNumericPairs(obj));

    0 讨论(0)
  • 2020-11-22 13:29

    Recursive convert object to array

    function is_object(mixed_var) {
        if (mixed_var instanceof Array) {
            return false;
        } else {
            return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
        }
    }
    
    
    function objectToArray(obj) {
        var array = [], tempObject;
        for (var key in obj) {
    
            tempObject = obj[key];
    
            if (is_object(obj[key])) {
                tempObject = objectToArray(obj[key]);
            }
            array[key] = tempObject;
        }
        return array;
    }
    
    0 讨论(0)
提交回复
热议问题