複数の配列をマージ(結合)する方法
JavaScriptで複数の配列データを1つの配列にまとめたいことがあったので調べたら、意外と色々な方法があったのでメモとして残しておきます。
目次
- 配列のマージ
- 重複する文字列(または数値)を除外したマージ
- 重複するデータ(オブジェクト)を除外したマージ
- 参考リンク
配列のマージ
concat()やスプレッド構文(...)を使うと元の配列はそのままに、マージした新しい配列を取得できます。
var array1 = ["1", "2", "3"];
var array2 = ["3", "4"];
var array12a = array1.concat(array2);
var array12b = [...array1, ...array2];
array12a[0] = "aaa";
array12b[1] = "bbb";
console.log(array1); // ["1", "2", "3"]
console.log(array2); // ["3", "4"]
console.log(array12a); // ["aaa", "2", "3", "3", "4"]
console.log(array12b); // ["1", "bbb", "3", "3", "4"]
重複する文字列(または数値)を除外したマージ
格納されている値が文字列(または数値)の場合で、同じ文字列を除外したい時は、Setオブジェクトを使うと一意の値になります。
var array1 = ["1", "2", "3"];
var array2 = ["3", "4"];
var array12c = [...new Set([...array1, ...array2])];
console.log(array12c); // ["1", "2", "3", "4"]
重複するデータ(オブジェクト)を除外したマージ
配列に格納されているデータがオブジェクトの場合、Setオブジェクトでは一意になりませんが、reduce()を使って重複するデータを除外することが可能です。
var array3 = [
{id: 1, name: "a"},
{id: 2, name: "b"},
{id: 3, name: "c1"}
];
var array4 = [
{id: 3, name: "c2"},
{id: 4, name: "d"}
];
var array34a = array3.concat(array4);
var array34b = [...array3, ...array4];
var array34c = [...new Set([...array3, ...array4])];
var array34d = [...array3, ...array4].reduce((a, v, i) => {
a[v.id] = v;
return a;
}, {});
var array34e = Object.values(array34d);
array34e[3].name = "eee";
console.log(array3); // [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c1"}]
console.log(array4); // [{"id":3,"name":"c2"},{"id":4,"name":"eee"}]
console.log(array34a); // [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c1"},{"id":3,"name":"c2"},{"id":4,"name":"eee"}]
console.log(array34b); // [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c1"},{"id":3,"name":"c2"},{"id":4,"name":"eee"}]
console.log(array34c); // [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c1"},{"id":3,"name":"c2"},{"id":4,"name":"eee"}]
console.log(array34d); // {"1":{"id":1,"name":"a"},"2":{"id":2,"name":"b"},"3":{"id":3,"name":"c2"},"4":{"id":4,"name":"eee"}}
console.log(array34e); // [{"id":1,"name":"a"},{"id":2,"name":"b"},{"id":3,"name":"c2"},{"id":4,"name":"eee"}]
reduce()を使った方法ではkeyにidをセットして重複したデータを除外しているため、最終的にObject.values()で値のみを取り出しています。
今回のマージ方法ではオブジェクトの値をコピーして新しく生成しているわけではないので、マージ後の配列から値を書き換えると、元の配列のオブジェクトの値も書き換わります。