2016-12-29 2 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, где он будет в задней части; нет другого объекта, чтобы сравнить его и заказать. Если есть несколько объектов, я меняю порядок этих объектов на основе возрастающей цены, а затем нажимаю их отдельно в массив 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

на первый, своего рода, если для целей цикла (тот лучше производительность) –

+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, предполагая, что значение a строка
  • 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 и цены (верхний не имеет арендной платы но более высокая цена, нижняя не имеет лизингового платежа, поэтому первая возвращает false, поэтому отсортирована после цены? –

+0

Операция op не предоставила никаких данных и не показала реального примера результата сортировки, все просто догадывается. –

Смежные вопросы