2017-02-02 2 views
0

私は下線sortByを使用していますが、私は最も安いコストでJSONオブジェクトの配列をソートしています...アンダースコア:sortBy最低価格が2以上、同じ価格でなければ、sortBy date ...など

「は、2つの以上の結果が同じコストである場合、収集ポイントの順序は次の優先順位でなければなりません(最初に最高の優先順位)

最低:

は何クライアントが欲しいのはこれです価格(デフォルト) - ユニーク価格の場合 検索場所からの距離 最も早い収集日 "

これは何が可能ですか?

あなたは10の項目と 2のリストを持っていた場合 2は£2、£1は、 2は£3、 2です 2は£5 あり、£4はこれが終了するつもりはありません並べ替えの優先順位を把握しようと少し狂っている?

+0

[複数の属性に基づいたアンダースコア:sortBy()]の可能な複製](http://stackoverflow.com/questions/16426774/underscore-sortby-based-on-multiple-attributes) –

答えて

0

が、それはあなたがカスタムコンパレータを設定することができますので、これは、私が実際にArray.prototype.sortを使用することを好む場合でありますこの関数を使うと、複数のパスを使わずに配列をソートしたり、ハッキリの回避策を使用したりすることができます。

これは、比較するいくつかの関数(またはプロパティ)を指定できる比較的簡単なコンパレータの実装です.2つのオブジェクトが1つの関数で等しい場合、次の関数が使用されます。

const items = [{ 
 
    cost: 1, 
 
    prioritiy: 1 
 
}, { 
 
    cost: 2, 
 
    prioritiy: 1 
 
}, { 
 
    cost: 1, 
 
    prioritiy: 2 
 
}]; 
 
items.sort(by('cost', 'priority')); 
 
console.log(items); 
 

 
function by(...args) { 
 
    const funcs = args.map(arg => 
 
    typeof arg === 'function' ? arg : obj => obj[arg] 
 
); 
 
    const compare = (val1, val2) => { 
 
    return typeof val1 === 'string' && 
 
      typeof val2 === 'string' 
 
      ? val1.localeCompare(val2) 
 
      : val1 - val2; 
 
    }; 
 
    return (a, b) => { 
 
    for (let i = 0; i < funcs.length; i++) { 
 
     let comp = compare(funcs[i](a), funcs[i](b)); 
 
     if (comp !== 0) { 
 
     return comp; 
 
     } 
 
    } 
 
    return 0; 
 
    }; 
 
}

また、Lodashはこの動作で_.sortByを持っている下線の代わりのライブラリです。

関連する問題