Как удалить объекты в объекте?

215
21 февраля 2018, 12:22

Есть некий объект, внутри которого другие объекты доступны по ключам:

segment0_0
segment0_1
segment1_0
segment1_1

Мне нужно из объекта эти элементы удалять в цикле, ибо могут встречаться так же и элементы с ключами segment2_0, segment3_1 и т.д. Попытался удалять их во вложенном цикле, но почему-то последний элемент под ключом segment1_1 никогда не удаляется:

for(let i = 0; i < Object.keys(rules).length; i++) {
    for(let j = 0; j < Object.keys(rules).length; j++) {
        if(rules[`airports_seg${i}_${j}`]) {
            delete rules[`airports_seg${i}_${j}`];
        }
    }
}

Как мне правильно удалять такие элементы?

Answer 1

Предположим есть объект

var rules = {
    segment0_0:1,
    segment0_1:'3232',
    segment1_0:{},
    segment1_1:true,
    segment2_1:true,
}

Ключ объекта состоит например из общего признака, типа и id, те в segment0_1 segment-общий признак, 0 - тип, 1 - id. задача удалить типы меньше чем 2

var separator = 'segment';
for(let key in rules)
{
   if(key.indexOf(separator)>-1)
   {
       let info = key.replace(separator,'');
       let info_arr = info.split('_');
       let type = info_arr[0];
       let id = info_arr[1];
       if(type<2)
       {
         delete rules[key];
       }
   }
}

Прошу прощение если придумал лишнего, у вас недостаточно точное описание задачи, пришлось додумать самому. В любом случае думаю помогло. То что вы делали было очень неправильно, поэтому и не работало

Answer 2
delete myObject.prop;
// или,
delete myObject['prop'];
// или,
var prop = "prop";
delete myObject[prop];

Тест:

var myObject = {
    "prop1": "HELLO WORLD",
};
delete myObject.prop1;

По вашему вопросу:

У вас ключи segment0_0 а Вы пытаетесь удалить airports_seg0_0 + у Вас на втором цикле удаляется элемент и у вас цикл просто не доходит до 1_1

var rules = {
    segment0_0: "asd",
    segment0_1: "asd",
    segment1_0: "asd",
    segment1_1: "asd",
}
var a = { ...rules };
for(let i = 0; i < Object.keys(rules).length; i++) {
    for(let j = 0; j < Object.keys(a).length; j++) {
        if(rules[`segment${i}_${j}`]) {
            delete rules[`segment${i}_${j}`];
        }
    }
}
console.log(rules);

еще вариант:

var rules = {
    segment0_0: "asd",
    segment0_1: "asd",
    segment1_0: "asd",
    segment1_1: "asd",
}
var arr = [];
for(let i = 0; i < Object.keys(rules).length; i++) {
    for(let j = 0; j < Object.keys(rules).length; j++) {
        console.log(i,j);
        if(rules[`segment${i}_${j}`]) {
            arr.push(`segment${i}_${j}`)
        }
    }
}

for(let i=0; i< arr.length; i++) {
    console.log(arr[i])
    delete rules[arr[i]];
}
READ ALSO
Как content script общается с background? (В google расширении)

Как content script общается с background? (В google расширении)

Не получается подключить content script с backgroundНе реагирует

240
Angular 2 - Дождаться ответа от сервера

Angular 2 - Дождаться ответа от сервера

Вопрос такой - как сделать, чтобы при выполнении такой функции

220
Редактирование jTable

Редактирование jTable

Добрый деньу меня появилась задача отредактировать элементы внутри класса

219