如何优化两个对象数组的合并?

时间:2014-02-27 10:06:19

标签: javascript arrays performance

我想优化CPUmemory消费的代码。在我的函数中,我需要将两个对象数组合并到一个数组中。与UNION类似,数组中对象的所有id都必须是唯一的。我不想使用像Underscore这样的第三方库。

这是我的功能:

var presentation_slides = [
  {
    "id": "2",
    "type": "results"
  },
  {
    "id": "1",
    "type": "slide"
  },
  {
    "id": "4",
    "type": "questions"
  }]

for(var i = 0; i < new_length; i++) {
    var my_slide = presentation_slides.filter(function (obj) { return obj.id == i })[0]
    if(!my_slide) {
        presentation_slides.push({"id": i, "type": "slide"});
    }
}

输出:

var presentation_slides = [
  {
    "id": "2",
    "type": "results"
  },
  {
    "id": "1",
    "type": "slide"
  },
  {
    "id": "4",
    "type": "questions"
  },
  {
    "id": 0,
    "type": "slide"
  },
  {
    "id": 3,
    "type": "slide"
  }]

谢谢!

修改

一些比较测试:http://jsperf.com/how-can-be-optimized-merging-of-two-arrays-of-objects

3 个答案:

答案 0 :(得分:1)

您可以使用some代替filter,我已为code snipet添加jsperf,这更快......

检查一下:.....jsperf.....

for (var i = 0; i < new_length; i++) {

    if (!presentation_slides.some(function(obj) { return obj.id == i}))
        presentation_slides.push({ "id": i, "type": "slide" });
}

答案 1 :(得分:0)

如果您只想合并两个数组,则可以使用Array.concat()

var array1 = [
    { id: 1, type: "orange" },
    {id: 3, type: "apple" },
    { id: 4, type: "banana" } ],
    array2 = [
        { id: 8, type: "strawberry" },
        { id: 9, type: "raspberry" }
    ];

var array3 = array1.concat(array2);

array3将包含array1array2中的所有元素。

这不会检查ID是否是唯一的。

答案 2 :(得分:0)

另外,反向循环要快一点:

var i = new_length;
while (i--) {
    if (!presentation_slides.some(function(obj) { return obj.id == i })) {
        presentation_slides.push({ "id": i, "type": "slide" });
    }
}

检查此...jspref...