对象被推入嵌套在另一个数组

时间:2016-12-29 17:22:10

标签: javascript arrays sorting object

我有一个名为specials的对象数组,每个对象看起来像这样:

{
apr_rate:"",
client_id:"",
disclaimer:",
lease_payment: "",
make:"",
model:"",
name:"",
platform:"",
price:"",
specialOrder:"",
specialStyle: "",
trim:"",
visible:"",
website:"",
year:"",
}

我有一个遍历数组中每个对象的循环,并检查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个特殊对象中的两个被取出,排序并放回。但是,它们现在嵌套在一个数组中。

我错过了什么或做错了什么?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

会发生这种情况,因为splice会返回一个数组。所以在行

tempObj = specials.splice(i, 1);

tempObj将是一个存储此类的数组。  写一个解决方案

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

答案 1 :(得分:1)

你的推送冲动有点复杂。我会像这样重新排序:

 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);

答案 2 :(得分: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);

答案 3 :(得分:0)

您只能使用排序功能,首先按

排序
  • lease_payment,asending,假设值为字符串
  • price,升序,假设值是数字

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; }