【问题标题】:How to convert JSON object to JavaScript array?如何将 JSON 对象转换为 JavaScript 数组?
【发布时间】:2013-01-09 19:19:31
【问题描述】:

我需要将 JSON 对象字符串转换为 JavaScript 数组。

这是我的 JSON 对象:

{"2013-01-21":1,"2013-01-22":7}

我想拥有:

var data = new google.visualization.DataTable();
data.addColumn('string', 'Topping');
data.addColumn('number', 'Slices');

data.addRows([
    ['2013-01-21', 1],
    ['2013-01-22', 7]
]);

我怎样才能做到这一点?

【问题讨论】:

  • 作弊 -> string.split(',')
  • @adeneo 他想要数组中的数组,用你的方法它将只是一个数组

标签: javascript json


【解决方案1】:

对@Mister Aqua 的一些修正 解决方案

const my_array = [];
    Object.entries(set_of_objects).map(function (entry) {
      const key = entry[0];
      const value = entry[1];

      const nested_object = {};

      nested_object[key] = value;
      my_array.push(nested_object);
    });

镇静丸:)

【讨论】:

    【解决方案2】:

    考虑有一个我们想要转换的 json 对象

    const my_object = {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    }
    

    您可以使用多种解决方案:

    1. Object.keys()Object.values()

    这些函数将任何对象转换为数组。一个返回一个包含所有键的数组,另一个返回所有值:

    console.log(Object.keys(my_object))
    // Output : ["key1", "key2", "key3"]
    
    console.log(Object.values(my_object))
    // Output : ["value1", "value2", "value3"]
    

    我不确定是否理解最初的问题,但解决方案可能是

    data.addRows(Object.values(my_object));
    

    2。 Object.entries()

    这个函数是上面两个的混合:

    console.log(Object.entries(my_object))
    // Output : [["key1", "value1"],  ["key2", "value2"],  ["key3", "value3"]]
    

    最初的问题没有用,但是这个功能太有用了,我不得不提一下。特别是当 value_ 是嵌套对象时。 假设我们的值是这样的对象:

    const my_object = {
        "key1": {"a": 1, "b": 2},
        "key2": {"y": 25, "z": 26},
        "key3": {"much": "stuff"}
    }
    

    我们希望得到一个像这样的数组

    my_array = [
        {"key": "key1", "a": 1, "b": 2},
        {"key": "key2", "y": 25, "z": 26},
        {"key": "key3", "much": "stuff"}
    ]
    

    我们需要使用Object.entries() 来获取我们所有的密钥及其值。我们将从一个过于详细的代码开始:

    my_array = Object.entries(my_object).map(function(entry){
       key = entry[0];
       value = entry[1];
    
       nested_object = value;
       nested_object.key = key;
    
       return nested_object;
    });
    
    console.log(my_array);
    // Expected output : [
    //    {"key": "key1", "a": 1, "b": 2},
    //    {"key": "key2", "y": 25, "z": 26},
    //    {"key": "key3", "much": "stuff"}
    //]
    

    我们可以利用 spread operator 来简化我们的代码:

    my_array = Object.entries(my_object).map(entry => {"key": entry[0], ...entry[1]});
    
    console.log(my_array);
    // Expected output : [
    //    {"key": "key1", "a": 1, "b": 2},
    //    {"key": "key2", "y": 25, "z": 26},
    //    {"key": "key3", "much": "stuff"}
    //]
    

    【讨论】:

    • 没有 "JSON 对象""JSON 数组" 这样的东西。 JSON 是某种数据结构的文本表示(通常是对象或数组,但任何数据类型都可以编码为 JSON)。因为 JSON 是文本,仅此而已,为了处理它,必须将其解码回与用于创建 JSON 的数据结构等效的数据结构。在您的示例中,json_object 是一个 JavaScript 对象(不需要在键周围加上引号),json_array 是一个 JavaScript 数组。此响应中没有 JSON 的痕迹。
    • 当然可以。我认为json_object 是我的json 中的对象。但我会重命名它们以避免进一步的混淆
    【解决方案3】:
    const json = '{"result":true, "count":42}';
    const obj = JSON.parse(json);
    
    console.log(obj.count);
    // expected output: 42
    
    console.log(obj.result);
    // expected output: true
    

    【讨论】:

      【解决方案4】:

      假设你有:

      var j = {0: "1", 1: "2", 2: "3", 3: "4"};
      

      您可以通过以下方式获取值(几乎所有浏览器版本都支持):

      Object.keys(j).map(function(_) { return j[_]; })
      

      或者简单地说:

      Object.values(j)
      

      输出:

      ["1", "2", "3", "4"]
      

      【讨论】:

      【解决方案5】:

      这样就可以解决问题了:

      const json_data = {"2013-01-21":1,"2013-01-22":7};
      
      const arr = Object.keys(json_data).map((key) => [key, json_data[key]]);
      
      console.log(arr);
      

      或者使用Object.entries()方法:

      console.log(Object.entries(json_data));
      

      在这两种情况下,输出将是:

      /* output: 
      [['2013-01-21', 1], ['2013-01-22', 7]]
      */
      

      【讨论】:

      • 太棒了。但不适用于嵌套对象。 var data = {"2013-01-21":1,"2013-01-22":7, "ab":{"x":1}};返回 [["2013-01-21",1],["2013-01-22",7],["ab",{"x":1}]]
      【解决方案6】:

      您可以像这样将对象项插入到数组中

      let obj = {
        '1st': {
          name: 'stackoverflow'
        },
        '2nd': {
          name: 'stackexchange'
        }
      };
       
       let wholeArray = Object.keys(obj).map(key => obj[key]);
       
       console.log(wholeArray);

      【讨论】:

        【解决方案7】:

        就这么简单!

        var json_data = {"2013-01-21":1,"2013-01-22":7};
        var result = [json_data];
        console.log(result);
        

        【讨论】:

        • 这将创建一个数组,其中包含一个对象(json 数据对象)。
        • @Shivam,觉得有帮助吗?
        【解决方案8】:

        如果你有一个格式良好的 JSON 字符串,你应该可以做到

        var as = JSON.parse(jstring);
        

        我在通过 AJAX 传输数组时一直这样做。

        【讨论】:

        • +1 用于 JSON.parse()。目前它已经拥有广泛的浏览器支持:caniuse.com/json
        • 这似乎返回一个对象而不是数组。对吧?
        • 它将返回您序列化的任何对象或对象集合。
        • IMO 这个更好的答案然后采纳了。
        【解决方案9】:
        function json2array(json){
            var result = [];
            var keys = Object.keys(json);
            keys.forEach(function(key){
                result.push(json[key]);
            });
            return result;
        }
        

        查看完整说明:http://book.mixu.net/node/ch5.html

        【讨论】:

        • 这不会保留密钥。
        【解决方案10】:
        var json_data = {"2013-01-21":1,"2013-01-22":7};
        var result = [];
        
        for(var i in json_data)
            result.push([i, json_data [i]]);
        
        
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Topping');
        data.addColumn('number', 'Slices');
        data.addRows(result);
        

        http://jsfiddle.net/MV5rj/

        【讨论】:

        • 我想要这样的东西:2013-01-21 ==> 1 2013-01-22 ==> 7(像哈希表)
        • @user1960311 这就是你现在拥有的
        猜你喜欢
        • 1970-01-01
        • 2021-05-02
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多