2016-10-31 7 views
0

私は整数の配列をソートして、それらを最大の整数を形成する順番に並べようとしています。たとえば、99,901> 90,199であるため[99、901]は[99、901]とソートする必要があります。 99,191> 91,991であるため、[91、991]は[991,91]のようにソートする必要があります。Javascript Array.prototype.sort()意図せずに配列を変異させる

これを行うには、Array.prototype.sort()を使用して、以下のコードブロックのcompare関数を引数として渡します。この比較関数の引数は、配列の配列です(各整数は最初に1桁の整数の配列に分割されます)。[[9,1]、[9,9,1]]。

私の問題は、この比較関数は機能しますが、いくつかの要素が切り捨てられた配列を返します。明らかに、これは、2つの整数の2番目(または3番目、4番目など)の要素を比較する必要があるときに、Array.prototype.shift()を呼び出しているためです。私はこれを期待していませんでしたが、回避策を見つけることはできません。例えば

、私は

[[9,9],[9,1,9]] 

で必要なものに対し、出力

[[9],[1,9]] 

次のコードは、あなたは私が探しています出力を得るために、私の比較関数を修正することができる方法を教えてもらえますか?

ありがとうございます!最も簡単な

var compare = function(a, b){ 

    if(a.length === 1 || b.length === 1){ 
     return (b[0] - a[0]); 
    } 

    else if(a[0] !== b[0]){ 
     return compare(a[0], b[0]); 
    } 

    else if(a[0] === b[0]){ 
     if(a.length !== 1){ 
      a.shift(); 
     } 
     if(b.length !== 1){ 
      b.shift(); 
     } 
     return compare(a, b); 
    } 
}; 

var example = function(){ 

    var digits = [[9,9],[9,1,9]]; 
    digits.sort(compare); 
    console.log(digits); 
}; 

example(); 
+0

'シフト()'配列を変異させます。それをしないでください。 – SLaks

+0

ヒント:これらの配列を文字列に変換して比較するだけです。 – Bergi

答えて

0

これを行うには(まだ非効率的な)方法は、あなたの配列をコピーすることです:

var compare = function(a, b){ 
a = a.slice(); 
b = b.slice(); 
+0

ありがとう!私はそれらの行に沿って何かを試してみたと思って、それは動作していませんでした。しかしこれはトリックです。 – korby

0

あなたはすでに答えを受け入れたが、私はまだあなたの質問にお答えしたいと思います... "どのように私の比較機能を修正することができますか?、あなたが本当にする必要があるため:それは現在、ここのように、いくつかの入力に対して間違った結果が得られます。

var compare = function(a, b){ 
 

 
    if(a.length === 1 || b.length === 1){ 
 
     return (b[0] - a[0]); 
 
    } 
 

 
    else if(a[0] !== b[0]){ 
 
     return compare(a[0], b[0]); 
 
    } 
 

 
    else if(a[0] === b[0]){ 
 
     if(a.length !== 1){ 
 
      a.shift(); 
 
     } 
 
     if(b.length !== 1){ 
 
      b.shift(); 
 
     } 
 
     return compare(a, b); 
 
    } 
 
}; 
 

 
console.log('this should return a number greater than 0:'); 
 
console.log(compare([8,1],[8,1,9,2]));

をここでそれを修正し、また、変異なしでそれを行う方法です:

var compare = function(a, b){ 
 
    for (var i = 0; i < a.length || i < b.length; i++) { 
 
     var diff = b[i % b.length] - a[i % a.length]; 
 
     if (diff) return diff; 
 
    } 
 
    return 0; 
 
}; 
 

 
console.log('this should return a number greater than 0:'); 
 
console.log(compare([8,1],[8,1,9,2])); 
 
var digits = [[8,1],[8,1,9,2]]; 
 
digits.sort(compare); 
 
console.log('sorted:'); 
 
console.log(JSON.stringify(digits));

関連する問題