2015-12-22 2 views
2

Я объект, который выглядит следующим образом:Изменение объекта в месте Javascript

var serviceData = {}; 

    serviceData.energy = {commission:15.00, retention:0.00, conversion:0.099, renewal: false, offset:0, rental: true} 
    serviceData.homeMedia = {commission:20.00, retention:0.00, conversion:0.02, renewal: false, offset:0, rental: true} 
    serviceData.removal = {commission:4.00, retention:0.00, conversion:0.05, renewal: false, offset:2, rental: true} 
    serviceData.storage = {commission:6.00, retention:0.09, conversion:0.01, renewal: true, offset:2, rental: true} 
    serviceData.homeContents = {commission:50.00, retention:0.55, conversion:0.40, renewal: true, offset:0, rental: false} 

Я хочу, чтобы петля над serviceData и если имущество нужного элемента, rental ложна Я хочу, чтобы удалить этот пункт из serviceData без фактического изменения объект serviceData. Другими словами, создайте новый объект за вычетом элемента «удалить».

Как я могу это сделать ???

+0

ли вы попробовать использовать '' delete' ... удалить serviceData.homeContents; ' – Musa

ответ

2

Просто перебирать ключи объекта и установить только те, которые вы хотите в новом объекте:

var serviceData = {}; 
 

 
serviceData.energy = {commission:15.00, retention:0.00, conversion:0.099, renewal: false, offset:0, rental: true} 
 
serviceData.homeMedia = {commission:20.00, retention:0.00, conversion:0.02, renewal: false, offset:0, rental: true} 
 
serviceData.removal = {commission:4.00, retention:0.00, conversion:0.05, renewal: false, offset:2, rental: true} 
 
serviceData.storage = {commission:6.00, retention:0.09, conversion:0.01, renewal: true, offset:2, rental: true} 
 
serviceData.homeContents = {commission:50.00, retention:0.55, conversion:0.40, renewal: true, offset:0, rental: false} 
 

 
var filtered = {}; 
 
for(var key in serviceData) { 
 
    if(serviceData[key].rental) { 
 
    filtered[key] = serviceData[key]; 
 
    } 
 
} 
 

 
document.write(JSON.stringify(filtered, '\n'));

Обратите внимание, что новый объект указывает на те же элементы («под-объекты»), это мелкая копия.

+0

в значительной степени было это на моих s крейн, но не мог добраться. Спасибо за это – Robbo

0

Вы можете использовать for-in loop и игнорировать ключ от предмета с помощью аренды false.

function copyData(obj, ignoreKey) { 
    var copiedObj = {}; 
    for (var key in obj) { 
    if (key === ignoreKey) { 
     continue; 
    } 
    copiedObj[key] = obj[key]; 
    } 
    return copiedObj; 
} 
var newObject = copyObj(serviceData, 'homeContents'); 
1

Первый Object.assign(...) скопировать весь объект, а затем использовать функцию «фильтр», чтобы отсортировать записи, основанные на правиле.

Или используйте функцию map для возврата значений на основе вашего правила, затем используйте «фильтр», чтобы отсортировать все записи null.

Подобно тому, как намек, чтобы иметь отправную точку ...

+0

моя первоначальная мысль состояла в фильтрации, но я не знаю, как это сделать на объектном литерале – Robbo

0

вы можете использовать JQuery каждый метод:

var res={}; 
    $.each(serviceData, function(index) { 
    if(serviceData[index].rental) 
    res[index] = serviceData[index] 
}) 

pen

+0

Он не хочет изменять serviceData obj ... – mat3e

+1

ok, тогда фильтр - правильный способ пойти – maioman

+0

Зачем вам использовать jQuery для этого? –

1

Мне нравится использовать lodash library для странных манипуляций :)

var newObj = _.omit(serviceData, function(property) { 
    return !property.rental; 
}); 
Смежные вопросы