高性能 - 在对键进行排序时将对象转换为数组

时间:2015-12-22 10:35:44

标签: javascript node.js

我有以下对象:

var myObj = {
              "4":{//The key is a number String.
                    id:4,name:aaaa
                  }
              "1":{
                    id:1,name:a
                  }
              "2":{
                    id:2,name:aa
                  }
              "3":{
                    id:3,name:aaa
                  }
            }

我想将其转换为以下数组:

var myArr = [{id:1,name:a},{id:2,name:aa},{id:3,name:aaa},{id:4,name:aaaa}]

我的问题更多的是语法问题,可以使用Javascript完成以下伪代码:

1. Create an array with the size of Object.keys(myObj).length.
2. For each key in myObj
    2.1 set myArr[key] = myObj[key]

实现这一目标的最快方法是什么?

BTW,它在我的node.js服务器中使用,而不是浏览器客户端。

4 个答案:

答案 0 :(得分:2)

我认为任何操纵都不会带来真正的性能提升。
此外,由于JavaScript在“引用 - ”方法上工作,这里真正的目标是创建一个数组并对其进行排序,因为您并没有真正深度复制对象。 它不应该是真正的性能命中,因为在你的例子中数组很小。

在这种情况下,更喜欢清晰的代码而不是psudo-performant代码:

var arr = [];
for (var o in myObj){
   arr.push(myObj[o]);
}
arr.sort(function(a,b){
  return a.id-b.id;
});

答案 1 :(得分:1)

首先,您的JSON不是有效的JSON,请使用,""。要完成您的任务,请使用Array.prototype.map



var myObj = {
              "4":{//The key is a number String.
                    id:4,name:"aaaa"
                  },
              "1":{
                    id:1,name:"a"
                  },
              "2":{
                    id:2,name:"aa"
                  },
              "3":{
                    id:3,name:"aaa"
                  }
            };

var arr = Object.keys(myObj).sort(function(a,b){return +a - +b;}).map(function(x){ return myObj[x]; }); // ES6
document.write(JSON.stringify(arr));




对于ECMAScript6使用

var arr = Object.keys(myObj).sort().map( x => myObj[x]);

答案 2 :(得分:1)

只需按键排序:



var myObj = { "4": { id: 4, name: 'aaaa' }, "1": { id: 1, name: 'a' }, "2": { id: 2, name: 'aa' }, "3": { id: 3, name: 'aaa' } },
    result = Object.keys(myObj).map(Number).sort(function (a, b) {
        return a - b;
    }).map(function (k) {
        return myObj[k];
    });

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 3 :(得分:1)

使用lodash:

var sortedById = _.sortBy(_.values(myObj), 'id');