2016-12-29 103 views
-1

我有对象的数组内,称为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数组中,因为它们需要被视为有自己的对象。见下文。

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个特殊对象中的两个被取出,排序并放回。但是,它们现在嵌套在数组中。

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

+0

首先,如果排序的for循环结束(这就是获得更好的性能) –

+0

你能以紧凑的方式添加一些数据和想要的那种结果。 –

+0

是'lease_payment'一个空字符串和一个数字作为字符串,或者只是一个字符串,有一些字母?请使用一些示例添加您的数据。 –

回答

4

它发生,因为splice返回一个数组。所以排队

tempObj = specials.splice(i, 1); 

tempObj将数组存储一个这样的。 一个解决办法是,写

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

你能解释一下在最后加上'[0]'索引究竟做了什么吗? – codnor

+0

取该数组的第一个元素。 –

+0

哇,我没有想到我的问题这么简单的答案哈哈。看起来像工作!谢谢!!出租后订购 – 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

你可以只使用一种功能,它首先排序由

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

+0

在lease_payment和price之间进行排序之间的边界处找不到它们的排序错误(上层没有租赁支付但较高的价格,较低的一个没有租赁付款,所以第一个返回false,因此排序后的价格? –

+0

op没有提供任何数据和排序结果没有实际的例子,都只是猜测。 –

相关问题