我想优化CPU
和memory
消费的代码。在我的函数中,我需要将两个对象数组合并到一个数组中。与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
答案 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
将包含array1
和array2
中的所有元素。
这不会检查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...