JavaScriptアレイの使用に関するいくつかのヒントに関する簡単な記事を以下に示します。さまざまな方法を使用して、2つのJSアレイを組み合わせたりマージしたり、各メソッドの利点/短所について説明します。
最初に次の状況を考えてみましょう:
コードコピーは次のとおりです。
var a = [1、2、3、4、5、6、7、8、9];
var b = ["foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"];
明らかに、最も単純な組み合わせの結果は次のとおりです。
コードコピーは次のとおりです。
[
1、2、3、4、5、6、7、8、9、
「foo "、" bar "、" baz "、" bam "bun"、 "fun"
]
concat(..)
これは最も一般的な慣行です。
コードコピーは次のとおりです。
var c = A.concat(b);
A; // [1,2,3,4,5,6,7,8,9]
b; // ["foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
c; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
ご覧のとおり、Cは2つの配列AとBの組み合わせを表し、AとBを不変に保つ新しい配列です。単純?
しかし、Aが10,000の要素を持ち、Bに10,000の要素がある場合は? Cには20,000の要素があるため、AとBのメモリ使用量は2倍になります。
"問題ない!"あなたが言った。それらを収集したゴミとし、AとBをnullに設定してください、問題は解決されます!
コードコピーは次のとおりです。
a = b = null; // 'a'および 'b'はリサイクルされます
hehe。わずかな要素しかない小さな配列の場合、これは問題ありません。しかし、大きなアレイ、またはメモリが限られているシステムの場合、このプロセスを頻繁に繰り返す必要がありますが、実際には多くの改善があります。
ループ挿入
わかりました、ある配列の内容を別の配列にコピーしましょう。
コードコピーは次のとおりです。
// `b`に` a`
for(var i = 0; i <b.length; i ++){
a.push(b [i]);
}
A; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
b = null;
ここで、配列Aには配列bの内容があります。
より良いメモリフットプリントがあるようです。
しかし、配列Aが小さい場合はどうなりますか?メモリとスピードの理由から、Bの前にAを小さくすることをお勧めします。問題ありません。プッシュ(..)をunshift(..)に変更するだけです。
コードコピーは次のとおりです。
// `a`に` b`に:
for(var i = a.length-1; i> = 0; i-){
B.Unshift(a [i]);
}
b; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
機能スキル
ただし、FORループは確かに醜く、維持が困難です。もっと良くできますか?
これは私たちの最初の試みです。配列#削減:
コードコピーは次のとおりです。
// `b`に` a`:
a = b.reduce(function(coll、item){
coll.push(item);
collを返します。
}、a);
A; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
//または `a`に` b`へ:
b = a.reduceright(function(coll、item){
coll.unshift(item);
collを返します。
}、b);
b; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
配列#reduce(..)と配列#reduceright(..)はいいですが、少し不器用です。 ES6 =>の矢印関数はコードの量を減らしますが、それでも関数が必要であり、各要素を1回呼び出す必要がありますが、これは完全ではありません。
それで、これはどうですか:
コードコピーは次のとおりです。
// `b`に` a`:
a.push.apply(a、b);
A; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
//または `a`に` b`へ:
B.Unshift.Apply(B、A);
b; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]
これははるかに良い場所ですか?特に、Unshift(..)メソッドは、以前の逆並べ替えについて心配する必要がないためです。 ES6の音声操作はより美しくなります:A.Push(... b)またはB.Unshift(...
配列の最大長い制限
最初の主要な問題は、メモリの使用量が2倍になること(もちろん一時的な!)が基本的に関数呼び出しを介して要素をスタックにコピーしていることです。さらに、異なるJSエンジンには、コピーデータの長さに制限があります。
したがって、配列に100万の要素がある場合、プッシュ(...)またはUnshift(...)がコールスタックを許可する限界を超えていることは間違いありません。残念ながら、それは何千もの要素を処理するのに最適な仕事をしますが、妥当な長さの制限を超えないように注意する必要があります。
注:Splice(...)を試すことができます。これには、Push(...)やUnshift(...)などの問題があります。
この最大長い制限を回避する方法があります。
コードコピーは次のとおりです。
関数combineinto(a、b){
var len = a.length;
for(var i = 0; i <len; i = i+5000){
B.Unshift.Apply(B、A.Slice(I、I+5000));
}
}
待ってください、私たちの読みやすさは後方になりました。それだけです、それはより悪くなるかもしれません、ハハ。