Свойства объекта динамическое удаление

Мне интересно узнать об улучшенном способе динамического удаления свойств из объекта javascript на основе подстановочных знаков. Во-первых, предположим, у меня есть следующий объект:

object =
{
    checkbox_description_1 : 'Chatoyant',
    checkbox_description_2 : 'Desultory',
    random_property : 'Firefly is a great program',
    checkbox_mood_1 : 'Efflorescent',
    checkbox_description_3 : 'Ephemeral'
}

задача

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

object =
{
    random_property : 'Firefly is a great program',
    checkbox_mood_1 : 'Efflorescent',
}

Мое решение

В настоящее время мое решение включает в себя jquery и следующий код:

var strKeyToDelete = 'checkbox_description'

/* Start looping through the object */
$.each(object, function(strKey, strValue) {

    /* Check if the key starts with the wildcard key to delete */
    if(this.match("^"+strKey) == strKeyToDelete) {

        /* Kill... */
        delete object[strKey];
    };
});

вопрос

Что-то в этом мне кажется очень не элегантным, и если объект должен быть разумного размера, он будет очень трудоемким. Есть ли лучший способ выполнить эту операцию?

4 ответа

Решение

Это необходимый минимум:

function deleteFromObject(keyPart, obj){
    for (var k in obj){          // Loop through the object
        if(~k.indexOf(keyPart)){ // If the current key contains the string we're looking for
            delete obj[k];       // Delete obj[key];
        }
    }
}

var myObject = {
    checkbox_description_1 : 'Chatoyant',
    checkbox_description_2 : 'Desultory',
    random_property : 'Firefly is a great program',
    checkbox_mood_1 : 'Efflorescent',
    checkbox_description_3 : 'Ephemeral'
};
deleteFromObject('checkbox_description', myObject);
console.log(myObject);
// myObject is now: {random_property: "Firefly is a great program", checkbox_mood_1: "Efflorescent"};

Так что это довольно близко к вашей функции jQuery.
(Хотя и немного быстрее, учитывая, что он не использует jQuery, и indexOf вместо match)

Итак, что с ~ до indexOf ?

indexOf возвращает целочисленное значение: -1 если строка не найдена, и индекс, начиная с 0, если он найден. (Так что всегда положительное целое число, если найдено)
~ побитовый NOT, что инвертирует этот вывод. Как это бывает, инвертированный выход indexOf это только то, что нам нужно указать "найдено" или "не найдено".

~-1 становится 0 ложное значение.
~x, где x является 0 или положительный, становится -(x+1), истинное значение.

Сюда, ~string.indexOf('needle') действует как string.contains('needle') функция, которой у нас нет в JavaScript.

Кроме того, вы можете добавить двойное логическое значение не (!!) напротив ~, чтобы преобразовать вывод true-ish или false-ish в реальное true / false, но в JavaScript это не обязательно.
Функционально ~string.indexOf('needle') а также !!~string.indexOf('needle') равны.


Если вам конкретно нужен ключ, чтобы начать с иглы, замените:

~k.indexOf(keyPart)

С:

k.indexOf(keyPart) === 0
    var myObject = {
        checkbox_description_1 : 'Chatoyant',
        checkbox_description_2 : 'Desultory',
        random_property : 'Firefly is a great program',
        checkbox_mood_1 : 'Efflorescent',
        checkbox_description_3 : 'Ephemeral'
   };

const removeProperty = dyProps => ({ [dyProps]: _, ...rest }) => rest;

const remove_random_property = removeProperty('random_property');
console.log(remove_random_property(myObject));

Вы можете использовать Как проверить, если строка "StartsWith" другой строки?:

function deleteFromObject(keyToDelete, obj) {
    var l = keyToDelete.length;
    for (var key in obj)
        if (key.substr(0, l) == keyToDelete) // key begins with the keyToDelete
            delete obj[key];
}

Если вы ищете решение, которое не изменяет исходный объект, вы можете попробовать что-то вроде этого

      const omit = (source = {}, omitKeys = []) => (
  Object.keys(source).reduce((output, key) => (
    omitKeys.includes(key) ? output : {...output, [key]: source[key]}
  ), {})
)

Тесты

      const original = {a:1, b:2, c:3, d:4, e:5}
console.log('original: ', JSON.stringify(original));

const modified = omit(original, ['b', 'd'])
console.log('modified: ', JSON.stringify(modified));
console.log('original: ', JSON.stringify(original));

// Will log: 
// original: {"a":1,"b":2,"c":3,"d":4,"e":5}
// modified: {"a":1,"c":3,"e":5}
// original: {"a":1,"b":2,"c":3,"d":4,"e":5}

Это создаст новый объект и распространит на него все свойства исходного объекта, кроме тех, которые включены в список исключений (omitKeys).

Другие вопросы по тегам