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

Javascript 对象被推入嵌套在另一个数组中的数组中,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,我有一个称为“特殊”的对象数组,每个对象的外观如下: { apr_rate:"", client_id:"", disclaimer:", lease_payment: "", make:"", model:"", name:"", platform:"", price:"", specialOrder:"", specialStyle: "", trim:"", visible:"", website:"", year:"", } specials.sort((a,b)=>{

我有一个称为“特殊”的对象数组,每个对象的外观如下:

{
apr_rate:"",
client_id:"",
disclaimer:",
lease_payment: "",
make:"",
model:"",
name:"",
platform:"",
price:"",
specialOrder:"",
specialStyle: "",
trim:"",
visible:"",
website:"",
year:"",
}
 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;
   }});
我有一个循环遍历数组中的每个对象,检查lease_payment属性是否为空。在这种情况下,我将该特定对象从数组中拼接出来,存储在名为tempObj的新对象中,然后将其推入名为tempArray的新数组中。我之所以要拼接,是因为我需要先按租赁付款的升序来订购此对象数组-如果没有租赁付款,它需要按价格的升序来订购剩余的对象。但是,价格的订购需要在租赁订购之后进行。见下文:

    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数组,它就会嵌套在另一个数组中,如此屏幕截图所示:

在本例中,5个特殊对象中的两个被取出、排序并放回。但是,它们现在嵌套在数组中

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

这种情况会发生,因为splice返回一个数组。如此一致

tempObj = specials.splice(i, 1);
tempObj将是一个数组,存储一个这样的数组。 一个解决办法是,写

tempObj = specials.splice(i, 1)[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);

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

{
apr_rate:"",
client_id:"",
disclaimer:",
lease_payment: "",
make:"",
model:"",
name:"",
platform:"",
price:"",
specialOrder:"",
specialStyle: "",
trim:"",
visible:"",
website:"",
year:"",
}
 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);

您只能使用排序函数,该函数首先按

租赁付款,asending,假设值为字符串 价格,升序,假设值为数字 var数据=[{租赁付款:,价格:30},{租赁付款:,价格:10},{租赁付款:'a',价格:11},{租赁付款:'b',价格:13},{租赁付款:'c',价格:15},{租赁付款:,价格:8}]; data.sort函数a、b{ 返回a.lease|u payment.localeCompareb.lease|u payment | a.price-b.price; }; 控制台日志数据;
。作为控制台包装器{max height:100%!important;top:0;}首先,如果for循环结束,则进行排序这对性能更有利您可以以紧凑的方式添加一些数据和所需的排序结果。租赁付款是空字符串和数字作为字符串,还是只是字符串和一些字母?请用一些例子添加您的数据。您能解释一下在末尾添加[0]索引到底是做什么的吗?使用该数组的第一个元素。哇,我没想到我的问题会有这么简单的答案哈哈。看来这奏效了!非常感谢。租赁后订购租赁!喜欢这种方式比我的方式好得多,谢谢!!在租赁付款后的排序和价格之间的边界处,它们不是排序错误吗?较高的一个没有租赁付款,但较高的价格,较低的一个没有租赁付款,因此第一个返回false,因此在价格后排序?op没有提供任何数据,也没有排序结果的真实示例,都只是猜测。