Bạn có thể sử dụng một đối tượng để thu thập các thuộc tính của mình trong khi thay thế các bản sao và sau đó mở rộng / san phẳng đối tượng đó trở lại một mảng. Một cái gì đó như thế này:
function merge(args) {
args = Array.prototype.slice.call(arguments);
var o = { };
for(var i = 0; i < args.length; ++i)
for(var j = 0; j < args[i].length; ++j)
o[args[i][j].name] = args[i][j].value;
return o;
}
function expand(o) {
var a = [ ];
for(var p in o)
if(o.hasOwnProperty(p))
a.push({ name: p, value: o[p]});
return a;
}
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = expand(merge(arr1, arr2));
Tôi không biết đây có phải là cách nhanh nhất không nhưng nó hoạt động với bất kỳ số lượng mảng đầu vào nào; ví dụ, điều này:
var a = expand(
merge(
[{name: "lang", value: "English"}, {name: "age", value: "18"}],
[{name: "childs", value: '5'}, {name: "lang", value: "German"}],
[{name: 'lang', value: 'Pancakes'}]
)
);
Cung cấp cho bạn điều tương tự trong ađó arr3với "tiếng Đức" được thay thế bằng "Bánh kếp".
Tất nhiên, cách tiếp cận này giả định rằng tất cả các đối tượng của bạn đều có cùng một {name: ..., value: ...}dạng.
Bạn có thể thấy nó hoạt động ở đây (vui lòng mở bảng điều khiển của bạn): http://jsfiddle.net/ambiguous/UtBbB/
{name: "lang", value: "English"}?