结合三个二维数组的 JavaScript,保持第一个值唯一

标签 javascript arrays loops for-loop underscore.js

我有三个这样的二维数组,其中每个二维数组中每个子数组的第一个值对于该数组是唯一的。但是,其中一些数组可能缺少值。

示例:

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 的函数,但我找不到真正有用的函数(尽管我对 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 调用已经对网站速度造成影响。

最佳答案

你可以试试这段代码:

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);

Demo.

关于结合三个二维数组的 JavaScript,保持第一个值唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23913354/

相关文章:

javascript - Draft.js 插入不可变实体

javascript - 如何将 json 数据从 C# Controller 传递到 Angular js?

javascript - 使用 post__not_in 中的外部数组排除 WordPress 查询中的帖子

c++ - 作为参数传递给 C++ 中的类时的内存丢失

javascript - 如何以逆时针方式循环二维数组?

python - 将输入的以空格分隔的项目添加到字典中。 Python

javascript try catch 在 firefox 中不能完全工作

javascript - 如何从字符串中删除所有空格,除非该字符串的一部分被 Node 中的特定字符包围?

c++ - 如何在 C++ 中创建重复直到循环?

loops - 如何迭代 stdin 两次?