0

私はこのようなデータ配列を持っています

 data = [1,2,3,4,5,6,7,8,9];

このような結果を出したい、例1 + 3 = 4、4 + 3 = 7、ect

data = [1,4,7,2,5,8,3,6,9];

私は使用してdata.sort(function(x,y) { return x % 3});いますが、何も起こりません。

または他の提案?これは私のjsfiddleですhttp://jsfiddle.net/viyancs/Yt78J/3/

4

2 に答える 2

2

または0、ソート関数に渡された 2 つのアイテムの希望する順序を示す必要があります。-1+1

var data = [ ... ];

data.sort(function (a, b) {
  // if the value of modulo 3 of A is lower than of B,
  // A should go first.
  if (a % 3 < b % 3) return -1;

  // if the value of modulo 3 of A is greater than of B,
  // B should go first.
  if (a % 3 > b % 3) return +1;

  // if the value of modulo 3 is the same for both A and B
  // the order should be figured out out of the items themself
  if (a < b) return -1; // A should go first
  if (a > b) return +1; // B should go first

  return 0; // order should be preserved, will never happen for your values
});
于 2012-10-27T11:21:13.407 に答える
1

少し調べてみたところ、あなたの例が間違っている、またはあなたが説明したことが間違っているという結論に達しました。

Intellの算術(除算後もリマインダーが符号を保持する)を想定した場合、正しい解決策は次のようになります。

var data = [1, 2, 3, 4, 5, 6, 7, 8, 9];

function mod3Sort(a, b) {
    "use strict";
    var dif = a - b;
    if (dif % 3) return a % 3 - b % 3;
    return dif;
}
data.sort(mod3Sort);

結果があなたが提案したものとどのように異なるかに注意してください。正確には次のとおりです。

[3, 6, 9, 1, 4, 7, 2, 5, 8]

これは、番号が最初にリマインダーによってグループ化され、次にリレーションによってグループ化されるためです。つまり、最初は数字で、リマインダーは0、次は数字の後にリマインダー1、最後のグループはリマインダー2です。つまり、最初のグループはリマインダー1を持っている人です。 2番目のグループはリマインダー2を持っているグループで、最後のグループはリマインダー0を持っているグループです。したがって、自分自身をよりよく説明するか、例を修正する必要があります。

于 2012-10-27T23:02:16.027 に答える