【问题标题】:Object pushed into array nested within another array对象推入嵌套在另一个数组中的数组中
【发布时间】:2016-12-29 17:22:09
【问题描述】:

我有一个名为 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 数组时,它都会嵌套在另一个数组中,如下图所示:

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

我是否遗漏了什么或做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 首先,如果for循环结束,则排序(这对性能更好)
  • 您可以以紧凑的方式添加一些数据和想要的排序结果。
  • lease_payment 一个空字符串和一个数字作为字符串,还是只是一个字符串,带有一些字母?请通过一些示例添加您的数据。

标签: javascript arrays sorting object


【解决方案1】:

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

tempObj = specials.splice(i, 1);

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

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

【讨论】:

  • 你能解释一下在末尾添加[0] 索引到底是做什么的吗?
  • 获取该数组的第一个元素。
  • 哇,没想到我的问题这么简单的答案哈哈。看起来有效!谢谢!!
【解决方案2】:

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

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

【讨论】:

  • 喜欢这种方式比我的方法更好,谢谢!!
【解决方案3】:

你让它更具可读性:

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

【讨论】:

  • 先租后租!
【解决方案4】:

你只能使用排序函数,它首先按

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

【讨论】:

  • 在lease_payment和price之后排序之间的边界可能是排序错误(上一个没有租赁付款但价格更高,下一个没有租赁付款所以第一个返回false,因此排序后价格?
  • op 没有提供任何数据,也没有排序结果的真实示例,一切都只是猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2018-02-06
  • 2015-12-18
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多