2

orderArrayこれらの要素を持つ配列があります (これを と呼びましょう):
16 | 18 | 24 | 31 | 33

workingArrayこれらの要素を持つ別の配列があります (それを と呼びましょう):
16 | 53 | 24 | 58 | 31 | 18

resultArrayたとえば、[16, 53, 18, 24, 58, 31] または [16, 18, 53, 24, 58, 31] のようになります。

resultArray には workingArray のすべての要素が含まれている必要がありますが、並べ替え順序は orderArray と競合しません。
ご注意ください

  • orderArray と workingArray は互いに異なる要素を持つことができます
  • 要素は配列内で一意です

それを行う関数/ライブラリがすでに存在する場合、私は本当に幸せです-私はすでに試し_.unionましたが、それは仕事をしません。

既に作成されたコードを除いて、それを実現する最も簡単なアルゴリズムは何ですか?

ありがとう。

編集: resultArray の要素の並べ替え順序はできるだけ変更しないでください。変更は、orderArray の順序と競合しないように厳密に行う必要があります。

4

1 に答える 1

2

本旨:

orderArray.filter(inWorkingArray).concat(workingArray.filter(notInOrderArray))

orderArray(作業配列にない項目を無視してコピーしworkingArray、順序配列にない項目を追加します)

メンバーシップ、またはより効率的な実装をテストするために使用できますindexOf(オブジェクト内のすべての要素のキーを作成し、暗黙的にそれらを文字列に変換し、その最適化が非プリミティブ オブジェクトでは機能しないようにします)。indexOf以下は、サブ配列のような非プリミティブ オブジェクトにも一般化する必要があるだけの最も単純な例です。

var inWorkingArray = function(x) {return workingArray.indexOf(x)!=-1};
var notInOrderArray = function(x) {return orderArray.indexOf(x)==-1};

結果:

[16, 18, 24, 31, 53, 58]

これは良い解決策ですが、結果の配列内の要素の順序はそれほど変更すべきではありません。workArray を元の順序と同じ順序に保つようにする必要があります。申し訳ありませんが、それについてはあまり明確ではありませんでした。質問の私の編集をご覧ください。--OP

問題はまだ明確に定義されていませんが、これにより、orderArray に従って workingArray のサブセットがソートされ、orderArray にない要素がそのまま残ります。

var intersection = orderArray.filter(inWorkingArray);
var c=0;
workingArray.map(function(x){
    return notInOrderArray(x) ? x : intersection[c++];
});

結果:

[16, 53, 18, 58, 24, 31]
于 2012-10-04T21:16:06.027 に答える