6

次のようなサイズの配列があります。

var arr = [
  'small',
  'small',
  'small',
  'small',
  ...
  'medium',
  'medium',
  'medium',
  'medium',
  ...
  'big',
  'big',
  ...
];

この配列を次の順序で再編成する必要があります。

var order = ['small', 'small', 'medium', 'medium', 'big'];

したがって、結果は次のようになります。

var arr = [
  'small',
  'small',
  'medium',
  'medium',
  'big',

  'small',
  'small',
  'medium',
  'medium',
  'big'

  ...
];

SO で他の同様の質問を認識していますが、これまでのところ何も見つかりませんでした。これにアプローチする方法がわかりません。私はsort何をすべきか考えていましたが、何をテストしますか?簡単に思えますが、どこから始めればいいのかわかりません。ヒントはありますか?

4

6 に答える 6

6

ソート方法のスコアラーを定義するだけです。これがあなたのコードです。それを試してみてください

var init_arr = ['small', 'big', 'big', 'medium'];

var scorer = {
   small: 0,
   medium: 1,
   big: 2
}

// You can use the same array too. I am creating new one.
var final_arr = init_arr.sort(function(a,b) {
   return scorer[a]-scorer[b];
});

alert(final_arr); //small, medium, big, big

ワーキングフィドル

于 2013-03-21T05:42:05.263 に答える
1

さて、私は最終的に機能するこのソリューションに行き着きました:

function orderBy(arr, order) {
  var result = [],
      i = 0, len = arr.length,
      index;

  while (result.length < len) {
    index = arr.indexOf(order[i]);
    result.push(arr[index]);
    arr.splice(index, 1);
    i = i >= order.length-1 ? 0 : ++i;
  }

  return result;
}

元の配列を変更しますが、問題ありません。

デモ: http://jsbin.com/umizat/1/edit

于 2013-03-21T07:14:59.813 に答える
1

この答えは、あなたが説明した正確なケース、つまり、配列の長さが5の偶数倍で、値が小、中、大にソートされ、小と中がそれぞれ2倍大きい場合にのみ機能します。

値の並べ替えられた配列に対して機能するlength % 5 == 0可能性がありますが、結果が望ましくない場合があります。

function reOrder(array) {
  var result = [];
  var f = array.length/5; // this must be an integer
  var t;

  for (var i=0; i<f; i++) {
    t = i*2;
    result.push.call(result, array.slice(t, t+2));
    t = f*2 + i*2;
    result.push.call(result, array.slice(t, t+2));
    t = f*4 + i;
    result.push.call(result, array.slice(t, t+1));
  }
  return result; 
} 

var a = ['s','s','s','s','s','s','m','m','m','m','m','m','b','b','b'];
alert(reOrder(a)); // s,s,m,m,b,s,s,m,m,b,s,s,m,m,b
于 2013-03-21T06:14:12.350 に答える
0

私のアプローチは、order配列をループし、配列が空になるか、必要な要素がなくなるまで要素を引き出すことです。

var sorted = [];
var arr = [
  'small',
  'small',
  'small',
  'small',
  ...
  'medium',
  'medium',
  'medium',
  'medium',
  ...
  'big',
  'big',
  ...
];
var order = ['small', 'small', 'medium', 'medium', 'big'];

out:
while (true) {
  for (var i = 0; i < order.length; i++) {
    var index = arr.indexOf(order[i]);
    if ((index === -1) or (arr.length === 0)) {
      break out;
    } else {
      var elem = arr.splice(index, 1);
      sorted.append(elem[0]);
    }
}
于 2013-03-21T05:57:09.433 に答える
0

この質問は古く、現在使用している回答があることは知っていますが、この例とJSFiddleを提供して、最後に行う可能性のあるあらゆる種類の変更で機能するソリューションを提供したいと思いました。

元の配列に残っているものはすべて、新しい配列の最後に追加され、除外されないことに注意してください。の要件を満たすのに十分な項目が配列にない場合order、不足している要素は順序からスキップされます。

さて、関数に:

function mySort(arr, order) {
    var newAr = [];
    var orIndex = 0;
    while(arr.length != 0) {
        var type = order[orIndex];
        var ind = arr.indexOf(type);
        if(ind != -1) {
            newAr.push(type);
            arr.splice(ind, 1);
        }
        orIndex++;
        if(orIndex >= order.length) {
            orIndex = 0;
        }
    }
    return newAr;
}

これが行うことは、次の例の配列を取ることです。

var arrTest = [
  'small',
  'small',
  'small',
  'small',
  'small',
  'small',
  'small',
  'small',
  'medium',
  'medium',
  'medium',
  'medium',
  'medium',
  'medium',
  'medium',
  'medium',
  'big',
  'big',
  'big',
  'big',
];
var orderTest = ['small', 'small', 'medium', 'medium', 'big'];

これで、これらを好きなように変更できますが、テキスト検索が行われるため、並べ替えたい場合は、完全な配列と順序配列の両方で同じであることを確認してください。関数を使用するには、次のようにします。

var sortedArray = mySort(arrTest, orderTest);

または、Fiddle でのデモ方法については、次のとおりです。

alert(mySort(arrTest, orderTest).join('\n'));

これは、この 2 つが関係するあらゆる状況で機能し、順序は簡単に変更できます。

それが役立つことを願っています!

于 2013-04-06T09:36:32.603 に答える
0

3 つの配列を作成し、サイズに応じてデータを分割しないのはなぜですか。そうすれば、特定の順序でデータを取得できます。

お気に入り;

SMALL[];
MEDIUM[];
BIG[];

for(i,j,k : upto array lengths : i++,j++,k++){

   nwArray.add(SMALL[i]);
   nwArray.add(SMALL[++i]);
   nwArray.add(MEDIUM[j]);
   nwArray.add(MEDIUM[++j]);
   nwArray.add(BIG[k]);

}

return newArray;
于 2013-03-21T05:50:45.457 に答える