2017-06-28 13 views
2

の配列の最後にする:ソートNULL値は、次のように私は、オブジェクトの配列を持つオブジェクト

c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}] 

私は一種-の最初にnullを指定してオブジェクトの値を持つオブジェクトによって、それらをソートしたいです。私が試した何

は次のとおりです。

c.sort(function(b) { return b.a ? -1 : 1 }) 

OUTPUT

[{a: 2}, {a: 50}, {a: 1}, {a: 12}, {a: null}, {a: null}] 

期待される出力

[{a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}, {a: null}] 

どのように私はこれを達成することができますか?

+0

@GokulanPHはい、私がすることができます。私はちょうど私の質問でそれを使用していないので、それをタグしなかった – Abhi

+1

[配列#ソート](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort )関数は2のアリティを持ち、比較のために 'a'と' b'引数を持ちます。 – Xotic750

+0

また、並べ替えの安定性に注意してください:https://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms – Xotic750

答えて

2

あなたは値をテストすることができます。 nullの場合は、比較のデルタを取る。安定したソートのために

var c = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; 
 

 
c.sort(function (a, b) { 
 
    return (a.a === null) - (b.a === null); 
 
}); 
 

 
console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }

、あなたはsorting with mapを使用し、第二の並べ替えオプションとしてインデックスを使用することができます。ソート機能で0を返す

// the array to be sorted 
 
var list = [{ a: null }, { a: 12 }, { a: 1 }, { a: 50 }, { a: 2 }, { a: null }]; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = list.map(function(el, i) { 
 
    return { index: i, value: el.a === null}; 
 
}); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function(a, b) { 
 
    return a.value - b.value || a.index - b.index; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function(el){ 
 
    return list[el.index]; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

恐ろしい解決 –

1

そうですか?

c=[{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; 
c.sort(function(a,b){ return a.a===null ? 1:-1 }) 
console.log(c); 

編集は

+0

これはオブジェクトをソートし、null値を持つオブジェクトを最後にプッシュしたい – Abhi

1

const c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; 
 

 
let result = [...c.filter(_=>_["a"]!==null),...c.filter(_=>_["a"]===null)]; 
 

 
console.log(result);

1

var c = [{ 
 
    a: null 
 
}, { 
 
    a: 12 
 
}, { 
 
    a: 1 
 
}, { 
 
    a: 50 
 
}, { 
 
    a: 2 
 
}, { 
 
    a: null 
 
}]; 
 

 
c.sort(function(a, b) { 
 
    return (a.a !== null) ? 0 : 1; 
 
}); 
 
console.log(c);

そのままの順序を維持します。

compareFunction(a、b)が0を返す場合は、aとbを互いに変更せず、すべての異なる要素に対してソートします。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

+0

@ Xotic750のコメント** "配列#ソート関数は2のアリティを持ち、それは比較のためにaとbの引数を持ちます。" **は正しいですが、この答えは私のために働いていました。 – Abhi

+0

私は間違っているかもしれませんが、端に、私は上部に1つ、下部に1つのヌル値を見ます。それは2つのvaules間のコンパイルの片側のみに大きく依存しています。 –

+1

@vsr、それでも同じ問題です。 –

1

return !a.a - !b.a .validオブジェクトで試してみてくださいそれは完璧ではないですが、まだ動作し、歓声最初

var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}]; 
 

 
c.sort(function (a, b) { 
 
    return !a.a - !b.a 
 
}); 
 
console.log(c);

0

を行きます!

var c = [{a: null}, {a: 12}, {a: 1}, {a: 50}, {a: 2}, {a: null}] 
 

 
c.sort(function(object1,object2){ 
 

 
    
 
    if(object1.a === null && object2.a !== null){return 1} 
 
    
 
    if([object1.a,object2.a].every((a)=>a === null) ||  
 
    [object1.a,object2.a].every((a)=>a !== null) 
 
    ){return 0} 
 
    
 
    if(object1.a !== null && object2.a === null){return -1} 
 
    
 

 

 
}) 
 

 
console.log(c);

関連する問題