我有三个2D数组,其中每个2D数组中每个子数组的第一个值对于该数组是唯一的。但是,其中一些数组可能缺少值。
示例:
var a = [[1, 10], [2, 20], [3, 20]];
var b = [[1, 20], [2, 10]];
var c = [[2, 30]];
数组a
的值为1,2和3,但数组b
的值仅为1和2,数组c
的值仅为2。
我想将这三个数组合并为一个新的最终数组,比方说d
。数组d
应该只包含每个第一个值中的一个,例如,上面的三个数组将组合成。
d = [[1, 10, 20], [2, 20, 10, 30], [3, 20]];
我的第一次半诅咒尝试:
我可以将三个数组合并为一个concat
:
a = a.concat(b, c);
// a = [[1, 10], [2, 20], [3, 20], [1, 20], [2, 10], [2, 30]];
但后来我不确定如何组合非独特元素。我已经查看了underscore
的一些函数,我找不到一个有用的函数(虽然我非常新的下划线)。
我的第二次尝试:
// First combine just a and b
for(var ai = 0; ai < a.length; ai++) {
var inserted = false;
for(var bi = 0; bi < b.length; bi++) {
if(a[ai][0] == b[bi][0]) {
d.push([(a[ai][0]), (a[ai][1]), (b[bi][1])]);
inserted = true;
}
}
if(!inserted) {
d.push([(a[ai][0]), (a[ai][1])]);
}
}
// Then repeat the above with d and c
此解决方案的问题在于,如果a
的元素少于b
,则结果将不包含b
a
所没有的元素。我可以编写一个荒谬的循环系列,但这只会非常低效,并且制作如此多的JSON调用已经对网站速度造成了影响。
答案 0 :(得分:1)
您可以尝试以下代码:
var a = [[1, 10], [2, 20], [3, 20]];
var b = [[1, 20], [2, 10]];
var c = [[2, 30]];
var d = a.concat(b,c);
var e = [];
//loop through all the inner arrays
//the first item in each array is considered as key
//the second is considered as value and should be pushed into some array
//which can be accessed via the key.
for(var i = 0; i < d.length; i++){
if(!e[d[i][0]]) e[d[i][0]] = [d[i][0]];
e[d[i][0]].push(d[i][1]);
}
d = [];
for(var i = 0; i < e.length; i++){
if(e[i]) d.push(e[i]);
}
console.log(d);
答案 1 :(得分:1)
试试这个:
function concat(first, second) {
var result = [],
i = 0,
j = 0,
k = 1;
if (second.length > first.length) {
result = second.slice();
first = first.slice();
} else {
result = first.slice();
}
for (i = 0; i < result.length; i++) {
for (j = 0; j < second.length; j++) {
if (result[i][0] === second[j][0]) {
for (k = 1; k < second[j].length; k++) {
result[i].push(second[j][k]);
}
}
}
}
return result;
}
答案 2 :(得分:1)
由于每个子阵列中的第一个元素是唯一的,那么为什么不这样写呢:
var a = { 1: [10], 2: [20], 3: [20] };
var b = { 1: [20], 2: [10] };
var c = { 2: [30] };
实际上让我们写一个函数来做到这一点:
var a = mapFrom2DArray([[1, 10], [2, 20], [3, 20]]);
var b = mapFrom2DArray([[1, 20], [2, 10]]);
var c = mapFrom2DArray([[2, 30]]);
function mapFrom2DArray(array) {
var map = {}, length = array.length, index = 0;
while (index < length) {
var subarray = array[index++];
map[subarray[0]] = subarray.slice(1);
}
return map;
}
现在让我们编写一个组合器,它将两个地图组合起来并组合起来:
function combine(a, b) {
var c = {};
for (var k in a) c[k] = a[k];
for (var k in b) {
if (c.hasOwnProperty(k))
c[k] = c[k].concat(b[k]);
else c[k] = b[k];
}
return c;
}
现在我们只需reduce
地图:
var d = mapToArray([a, b, c].reduce(combine));
哦,以及mapToArray
的定义:
function mapToArray(map) {
var array = [];
for (var k in map) array.push([parseInt(k)].concat(map[k]));
return array;
}
这就是全部。请参阅演示:http://jsfiddle.net/56B6T/1