1

私は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']
];

arr2からの値を同じarr1ところにマージしたい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:この回答は興味深いと思いますが、配列の長さが同じである必要がありitemid-xます。また、両方の配列でインデックスが同じでない場合は機能しません。

4

2 に答える 2

1

コードは問題なく動作しますが、これを改善できます。m*nソートされた配列を使用しているため、反復を使用する 2 つのループは必要ありません。m =および n =m+nである 2 つの配列をマージするために反復を行うことができます。arr1.lengtharr2.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++;
    }
}

あなたのものよりも多くの行がありますが、より高速です。使用する配列のサイズとコーディングの容易さに応じて、それを使用することをお勧めします。

于 2013-06-28T07:13:12.280 に答える
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のように見えます。;)

非常に多くの異なるデータ構造とユースケースがあり、データ構造から一般的なケースを実際に導き出すことはできないと思います。要素 [0] はどういうわけか特別ですが、それはデータ構造ではなくコードに反映されています。

興味深いと思った回答で検討したようなものに、データを再構築できますか? arr2 = { itemid-1: [ ... ], itemid-2: [ ... ] }. 次に、forEach-loop、単純なルックアップ、および連結を実行できますarr1[i].concat(arr2[v])

于 2013-06-28T19:40:18.907 に答える