【问题标题】:Converting JavaScript object with numeric keys into array将带有数字键的 JavaScript 对象转换为数组
【发布时间】:2014-01-19 19:09:54
【问题描述】:

我有一个像这样的对象作为来自服务器的 JSON 响应返回:

{
  "0": "1",
  "1": "2",
  "2": "3",
  "3": "4"
}

我想把它转换成这样的 JavaScript 数组:

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

有没有最好的方法来做到这一点?无论我在哪里阅读,人们都在使用循环使用复杂的逻辑。那么有没有其他方法可以做到这一点?

【问题讨论】:

标签: javascript jquery arrays json javascript-objects


【解决方案1】:

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

var parsed = JSON.parse(json);

var arr = [];

for (var x in parsed) {
  arr.push(parsed[x]);
}

console.log(arr)

希望这就是你所追求的!

【讨论】:

  • 谢谢。真的需要那个。有人在大量代码中使用一个对象作为数组,这很好,直到我需要在它之上构建......
  • 非常接近我需要的感谢:for(var x in data){ arr[x] = data[x]; }
【解决方案2】:

这里没什么难的。循环遍历您的对象元素并将它们分配给数组

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var arr = [];
for (elem in obj) {
   arr.push(obj[elem]);
}

http://jsfiddle.net/Qq2aM/

【讨论】:

    【解决方案3】:

    var JsonObj = {
      "0": "1",
      "1": "2",
      "2": "3",
      "3": "4"
    };
    
    var array = [];
    for (var i in JsonObj) {
      if (JsonObj.hasOwnProperty(i) && !isNaN(+i)) {
        array[+i] = JsonObj[i];
      }
    }
    
    console.log(array)

    DEMO

    【讨论】:

      【解决方案4】:

      没有什么能比得上“JSON 对象”——JSON 是一种序列化符号。

      如果您想将您的 javascript 对象 转换为 javascript 数组,您可以编写自己的循环 [这不会那么复杂!],或者您依赖underscore.js_.toArray()方法:

      var obj = {"0":"1","1":"2","2":"3","3":"4"};
      var yourArray = _(obj).toArray();
      

      【讨论】:

      • 谢谢 - 就像魅力一样。但是如何使它对内部对象也做同样的事情(对象中的对象)?内部对象也应该成为根级别数组的平面成员(以便可以将它们传递到 datatables.net 等)
      • +1:“没有什么比得上“JSON 对象”——JSON 是一种序列化符号。” - 我不敢相信我必须听多少遍才能完全理解它。
      【解决方案5】:

      你只是这样做

      var data = {
          "0": "1",
          "1": "2",
          "2": "3",
          "3": "4"
      };
      
      var arr = [];
      for (var prop in data) {
          arr.push(data[prop]);
      }
      
      console.log(arr);

      DEMO

      【讨论】:

        【解决方案6】:

        试试这个:

        var newArr = [];
        $.each(JSONObject.results.bindings, function(i, obj) {
            newArr.push([obj.value]);
        });
        

        【讨论】:

        • 您的解决方案将是这里提出的所有解决方案中最慢的一个......对业务代码不利;)
        【解决方案7】:

        使用 jQuery 的 $.map 实际上非常简单

        var arr = $.map(obj, function(el) { return el });
        

        FIDDLE

        没有 jQuery 也几乎一样简单,将键转换为数组,然后使用 Array.map 映射回值

        var arr = Object.keys(obj).map(function(k) { return obj[k] });
        

        FIDDLE

        这是假设它已经被解析为一个 javascript 对象,实际上不是 JSON,它是一种字符串格式,在这种情况下,还需要运行 JSON.parse

        在 ES2015 中,Object.values 提供了救援,这让这变得轻而易举

        var arr = Object.values(obj);
        

        【讨论】:

        • @adeneo 先生,您能否提供一些有关 htis 方法的解释。
        • @adeneo aka Mr.burns...感谢您的快速解决方案。
        • @NikhilAgrawal 这里的诀窍是使用 Object.keys(),它返回对象的键(= 它自己的可枚举属性)作为数组。然后我们可以使用 array.map 将每个键替换为新数组中对应的值。
        • 这是一个答案,但不是很友好。
        • 这个问题并不明确,但我假设对象的键本质上是数组的索引,它们是 (0,1,2,3)。只是指出人们应该知道这种方法不保证数组中的任何顺序;如果键是索引,那么您需要显式地对它们进行排序,以便以正确的顺序构建数组。
        【解决方案8】:

        假设您的值如下所示

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

        然后您可以使用以下方法将其转换为 javascript 数组

        var arr = [];
        json = JSON.stringify(eval('(' + obj + ')')); //convert to json string
        arr = $.parseJSON(json); //convert to javascript array
        

        这也适用于将 json 转换为多维 javascript 数组。

        当我使用 php json 编码的字符串时,除了我在此提到的方法之外,此页面上的其他方法似乎都不完全适合我。

        【讨论】:

          【解决方案9】:

          使用原始 javascript,假设您有:

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

          您可以通过以下方式获取值:

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

          输出:

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

          【讨论】:

            【解决方案10】:

            这是一个示例,说明如何获取对象数组,然后对数组进行排序。

              function osort(obj)
              {  // map the object to an array [key, obj[key]]
                return Object.keys(obj).map(function(key) { return [key, obj[key]] }).sort(
                  function (keya, keyb)
                  { // sort(from largest to smallest)
                      return keyb[1] - keya[1];
                  }
                );
              }
            

            【讨论】:

              【解决方案11】:

              不确定我在这里缺少什么,但只需尝试以下代码即可。我在这里有什么遗漏吗?

              https://jsfiddle.net/vatsalpande/w3ew5bhq/

              $(document).ready(function(){
              
              var json = {
                 "code" :"1", 
                 "data" : { 
                  "0" : {"id":"1","score":"44"},
                  "1" : {"id":"1","score":"44"}
                  }
                };
              
                createUpdatedJson();
              
                function createUpdatedJson(){
              
                  var updatedJson = json;
              
                  updatedJson.data = [updatedJson.data];
              
                  $('#jsondata').html(JSON.stringify(updatedJson));
              
              
                  console.log(JSON.stringify(updatedJson));
                }
               })
              

              【讨论】:

                【解决方案12】:

                这是最好的解决方案。我想是的。

                Object.keys(obj).map(function(k){return {key: k, value: obj[k]}})
                

                【讨论】:

                  【解决方案13】:
                        var data = [];
                  
                        data  = {{ jdata|safe }}; //parse through js
                        var i = 0 ;
                        for (i=0;i<data.length;i++){
                           data[i] = data[i].value;
                        }
                  

                  【讨论】:

                  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
                  【解决方案14】:

                  var obj = {"0":"1","1":"2","2":"3","3":"4"};
                  
                  var vals = Object.values(obj);
                  
                  console.log(vals); //["1", "2", "3", "4"]

                  问题的另一种选择

                  var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed
                  

                  【讨论】:

                    【解决方案15】:

                    您可以使用 PHP 将 json Object 转换为 Array & String。

                    $data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';
                    
                    $b=json_decode($data);
                    
                    $i=0;
                    while($b->{'resultList'}[$i])
                    {
                        print_r($b->{'resultList'}[$i]->{'displayName'});
                        echo "<br />";
                        $i++;
                    }
                    

                    【讨论】:

                    • 问题是关于 javascript 而不是 PHP。
                    【解决方案16】:

                    您可以将Object.assign() 与空数组文字[] 一起用作target

                    const input = {
                      "0": "1",
                      "1": "2",
                      "2": "3",
                      "3": "4"
                    }
                    
                    const output = Object.assign([], input)
                    
                    console.log(output)

                    如果您检查polyfillObject.assign(target, ...sources) 只需将所有可枚举的自己的属性从source 对象复制到目标对象。如果target 是一个数组,它会将数字键添加到数组字面量中并返回target 数组对象。

                    【讨论】:

                      【解决方案17】:

                      公认的解决方案期望键从 0 开始并且是连续的 - 它将值放入数组中,但在途中会丢失索引。

                      如果您的“带有数字键的对象”不满足这些更严格的假设,请使用此选项。

                      //let sourceObject = ...
                      let destinationArray = [];
                      Object.keys(sourceObject).forEach(k => destinationArray[k] = sourceObject[k]);
                      

                      【讨论】:

                        猜你喜欢
                        • 2010-12-24
                        • 2018-12-22
                        • 1970-01-01
                        • 2018-05-29
                        • 1970-01-01
                        • 2019-06-20
                        • 2016-07-05
                        • 2021-02-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多