2016-12-29 13 views
-1

別の配列内にネストされた配列の中に押し込まspecialsと呼ばれますlease_paymentプロパティが空の場合その場合、配列からその特定のオブジェクトをスプライスし、tempObjという新しいオブジェクトに格納し、tempArrayという新しい配列にプッシュします。私がスプライシングする理由は、オブジェクトの配列を最初にlease_paymentで昇順に並べ替える必要があるからです。リース料がない場合は、残りのオブジェクトをpriceで昇順に並べ替える必要があります。ただし、の注文後に価格の注文はにする必要があります。以下を参照してください:オブジェクトは、各オブジェクトはこのように見ていると、私はオブジェクトの配列を持っている

if (specials[i].lease_payment == "") { 
     tempObj = specials.splice(i, 1); 
     tempArray.push(tempObj); 
    } else { 
     // else just assume they're all lease offers and sort by lease payment 
     specials.sort(function(a, b) { 
      return a.lease_payment - b.lease_payment 
     }); 
    } 

私はその新しい配列tempArrayは1つのオブジェクト、または複数を持っているかどうかを確認します。 1つしかない場合、すぐにそれをメインのspecialsアレイに戻します。ここでアレイは背面にあります。それを比較して順序を決める別の目的はありません。複数のオブジェクトがある場合は、昇順の価格に基づいてそれらのオブジェクトの順序を変更し、オブジェクトをオブジェクトとして表示する必要があるため、配列を個別にspecials配列にプッシュします。下記参照。起こっている何

if (tempArray.length == 1) { 
    specials.push({tempArray}); 

} // else just sort the temp array by ascending price, push into main specials later 
else if (tempArray.length > 1) { 

    tempArray.sort(function(a, b) { 
     return a.price - b.price 
    }); 

    // grabs each individual object within temp array and pushes one at a time into main specials 
    for (i = 0; i < tempArray.length; i++) { 
     specials.push(tempArray[i]); 
    } 
} 

私はバックspecials配列にオブジェクトを押すたびに、このスクリーンショットで見られるように、いずれの場合において、それは、別のアレイ内にネストされていることである:この場合 ss

、 5つのスペシャルオブジェクトのうちの2つが取り出され、ソートされ、元に戻されました。しかし、配列内にネストされています。

何か不足しているか間違っていますか?どんな助けもありがとう。

+0

、 –

+0

あなたは、コンパクトな方法でいくつかのデータと希望ソート結果を追加することができます。 –

+0

は空の文字列 'lease_payment'であり、数字は文字列か文字列で、文字はいくつか?いくつかの例を挙げてデータを追加してください。 –

答えて

4

これは、spliceが配列を返すために発生します。だからライン

tempObj = specials.splice(i, 1); 

tempObjは、そのように格納されます。 ソリューションは、

tempObj = specials.splice(i, 1)[0]; 
+0

最後に '[0]'インデックスを追加していることを正確に説明できますか? – codnor

+0

その配列の最初の要素を取得します。 –

+0

うわー、私は私の問題hahaにそのような簡単な答えを期待していない。それがうまくいったように見えます!ありがとうございました!! – codnor

0

を書くためにあなたはそれをより読みやすくすることになります。

var leased = specials.filter(function(e) { return e.lease_payment != ""; }).sort(function(a, b) { return b.price - a.price }); 

var notLeased = specials.filter(function(e) { return e.lease_payment == ""; }).sort(function(a, b) { return b.price - a.price }); 

specials = leased.concat(notLeased); 
+0

リース後に賃貸注文! –

1

あなたのプッシュrepushは少し複雑です。

specials.sort((a,b)=>{ 
    if(a.lease_payment && b.lease_payment){ 
    return a.lease_payment-b.lease_payment;//sort after lease payment 
    }else if(a.lease_payment){ 
    return 1;//lease payment is already upper 
    }else if(b.lease_payment){ 
    return -1;//swapp 
    }else{ 
    //no leasepayment sort after prize; 
    return a.price - b.price; 
    }}); 

またはショート:

specials.sort((a,b)=>a.lease_payment&&b.lease_payment?a.lease_payment-b.lease_payment:a.lease_payment?1:b.leasepayment?-1:a.price-b.price); 
+0

これは私のアプローチよりもよく見える方法のように、ありがとう! – codnor

+0

そしてそのはるかに速い... –

+0

@ConnorMcManus私はこの質問を閉じるために/答えをマークする時間と思う... –

0

あなたが値を仮定し、asending、

  • lease_paymentすることにより、第1ソートのみソート機能を、使用することができている私はこのようにそれを並べ替えます文字列
  • price、昇順、仮定値は数値
  • ループ終了のために(パフォーマンスのためのより良いthatsの)ソート場合

最初の

var data = [{ lease_payment: '', price: 30 }, { lease_payment: '', price: 10 }, { lease_payment: 'a', price: 11 }, { lease_payment: 'b', price: 13 }, { lease_payment: 'c', price: 15 }, { lease_payment: '', price: 8 }]; 
 

 
data.sort(function (a, b) { 
 
    return a.lease_payment.localeCompare(b.lease_payment) || a.price - b.price; 
 
}); 
 

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

+0

彼らはlease_paymentと価格(上の1つはリース支払いをしていない後の並べ替えの間の境界で並べ替えミスすることはできませんでした高い価格、低いものはリース料がないので、最初のものが偽を返すので、価格の後にソートされますか? –

+0

opはデータを提供しておらず、ソート結果の実際の例もなく、すべてがちょうど推測です。 –

関連する問題