7

我很好奇一种基于通配符从 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

4 回答 4

9

这是最低要求:

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, where xis 0or positive, 变成-(x+1), 一个真实的值。

这样,~string.indexOf('needle')就像string.contains('needle')我们在 JavaScript 中没有的函数一样。

!!此外,您可以在 , 前面添加一个双布尔值 not ( )~以将 true-ish 或 false-ish 输出转换为真正的 true / false,但这在 JavaScript 中不是必需的。
在功能上,~string.indexOf('needle')并且!!~string.indexOf('needle')是平等的。


如果您特别需要从针头开始的钥匙,请更换:

~k.indexOf(keyPart)

和:

k.indexOf(keyPart) === 0
于 2012-12-14T08:55:33.387 回答
4
    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));
于 2019-03-18T17:44:31.150 回答
3

您可以使用如何检查一个字符串“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];
}
于 2012-12-14T11:29:43.313 回答
0

如果您正在寻找一种不会改变原始对象的解决方案,您可以尝试这样的事情

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) 中的属性。

于 2021-08-10T00:05:11.857 回答