【问题标题】:Conditional merge 2 two dimensional arrays条件合并2个二维数组
【发布时间】:2013-06-28 05:49:47
【问题描述】:

我有 2 个数组,

arr1 = [
    ['itemid-1', 'itemclass', 'timestamp'],
    ['itemid-2', 'itemclass', 'timestamp'],
    ['itemid-3', 'itemclass', 'timestamp'],
    ['itemid-5', 'itemclass', 'timestamp']
];

arr2 = [
    ['itemid-1', 'data-state', 'data-col'],
    ['itemid-3', 'data-state', 'data-col'],
    ['itemid-4', 'data-state', 'data-col']
];

最终结果应该是:

arr1 = [
    ['itemid-1', 'itemclass', 'timestamp', 'data-state', 'data-col'],
    ['itemid-2', 'itemclass', 'timestamp'],
    ['itemid-3', 'itemclass', 'timestamp', 'data-state', 'data-col'],
    ['itemid-5', 'itemclass', 'timestamp']
];

我想合并从 arr2arr1 的值,其中 itemid-x 是相同的。

我可以通过使用循环来做到这一点,

for(i = 0; i < arr1.length; i++){
    for(j = 0; j < arr2.length; j++){
        if(arr1[i][0] == arr2[j][0]){
            arr1[i] = arr1[i].concat(arr2[j].slice(1));
        }
    }

}

但是我最近开始使用 underscorejs 和 nodejs,所以我想知道是否可以使用任何现有功能来完成。

PS:我发现this answer 很有趣,但它要求数组的长度相同,如果两个数组中的itemid-x 索引不同,它也将不起作用。

【问题讨论】:

  • 所以您的代码可以正常工作,而您只是想寻找一种更简洁的方法来实现它?
  • 是的,当然,我也已经在使用下划线了,不介意添加其他库。
  • 您的代码使用原生 JavaScript 函数。恕我直言,您不需要其他任何东西,只需使用它即可。

标签: javascript arrays node.js underscore.js


【解决方案1】:

我不知道它是否真的让事情看起来更好或更容易理解,但你可以做到

arr1.forEach(function(v, i){arr2.filter(function(v2){return v[0]==v2[0]}).forEach(function(v3){v3.slice(1).forEach(function(e){v.push(e)})})});

这肯定看起来更像 js。 ;)

我认为有太多不同的数据结构和用例,以至于您无法真正从您的数据结构中得出一个常见的案例。 element [0] 有点特殊,但这反映在您的代码中,而不是数据结构中。

对于您认为有趣的答案中所考虑的内容,您可以重组您的数据吗? arr2 = { itemid-1: [ ... ], itemid-2: [ ... ] }。然后你可以做一个 forEach 循环、一个简单的查找和一个 concat:arr1[i].concat(arr2[v])?

【讨论】:

  • 谢谢,我也把 arr2 改成了 object。
【解决方案2】:

您的代码运行良好,但您可以对此进行改进。由于您使用的是排序数组,因此不需要两个使用 m*n 迭代的循环。您可以通过m+n 迭代合并两个数组,其中 m = arr1.length 和 n = arr2.length

var i = j = 0;
var answer = [];

while (i < arr1.length && j < arr2.length)
{
    arr1ptr = arr1[i][0];  // Just for checking index
    arr2ptr = arr2[j][0];  // You can extract 'id' if you want

    if (arr1ptr == arr2ptr)
    {
        answer.push(arr1[i].concat(arr2[j].slice(1)));
        i++;
        j++;
    }
    else if (arr1ptr < arr2ptr)
    {
        answer.push(arr1[i]);
        i++;
    }
    else if (arr1ptr > arr2ptr)
    {
        answer.push(arr2[j]);
        j++;
    }
}

它的行数比你的多,但速度更快。根据您使用的数组的大小和编码的难易程度,您可能想要使用它。

【讨论】:

  • 这很好,但数组并不总是排序的(也必须保留索引)。道歉作为我的例子可能会导致相信这一点。如果不匹配,我再次想要来自 arr1 的元素,而应该丢弃 arr2 元素。为此,我会将else if (arr1ptr &lt; arr2ptr) 更改为else,不需要第三个条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2022-01-18
  • 2013-03-08
  • 2021-11-17
  • 2021-10-21
相关资源
最近更新 更多