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` to` 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` to` a`:a = b.reduce(function(coll、item){coll.push(item); return coll;}、a); a; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"] //または `a`または` a`に「b」:b = a.reduceright(coll、item){coll.unshift(item); return coll;}、b); b; // [1,2,3,4,5,6,7,8,9、 "foo"、 "bar"、 "baz"、 "bam"、 "bun"、 "fun"]]配列#reduce(..)と配列#reduceright(..)はいいですが、少し不器用です。 ES6 =>の矢印関数はコードの量を減らしますが、それでも関数が必要であり、各要素を1回呼び出す必要がありますが、これは完全ではありません。
それで、これはどうですか:
// `b` to` 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(…A
配列の最大長い制限
最初の主要な問題は、メモリの使用量が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)); }}待ってください、私たちの読みやすさは後方になりました。そのように、それは悪化するかもしれません。
上記はこの記事に関するものです。誰もがJavaScriptプログラミングを学ぶことが役立つことを願っています。