【问题标题】:Removing javascript key/value pairs by index按索引删除 javascript 键/值对
【发布时间】:2017-06-22 06:04:02
【问题描述】:
function removeString(obj) {
  var propertyArray = Object.values(obj);            //make array of just properties 
  for(var i = 0; i < propertyArray.length; i++) {
     if (typeof propertyArray[i] === "string")          //find string
     delete Object.keys(obj)[i];  //delete the key with the same index as the string
  }                                
  return obj;//return new object without string 
}

var testObject = {size: 6, name: 'String', age: 20}

console.log(removeString(testObject)) //I want {size: 6, age: 20}

我希望上面的函数删除字段值为string,而不是返回的是原始对象。

对于任何阅读本文/愿意提供帮助的人,提前感谢您!

【问题讨论】:

    标签: javascript string function object key


    【解决方案1】:

    Object.keys(obj) 将返回一个包含obj 的所有键的数组(遍历对象的键并将它们(只是键而不是值)复制到结果数组中并返回)。因此,当您 delete 该数组的 i-th 条目时,obj 不受影响。多解释delete Object.keys(obj)[i]同:

    var aCopyOfTheKeys = Object.keys(obj); // get a copy of all the keys of obj
    delete aCopyOfTheKeys[i]; // remove the i-th property of aCopyOfKeys 
    

    因此,与其删除与obj 无关的数组条目,不如直接使用obj[key] 来delete obj 的属性,如下所示:

    function removeString(obj) {
        // loop through the keys of the object obj
        Object.keys(obj).forEach(function(key) {
            // if the value of this key is of type string
            if (typeof obj[key] === "string")
                // delete it
                delete obj[key];
        });
        return obj;
    }
    
    var testObject = {size: 6, name: 'String', age: 20}
    
    console.log(removeString(testObject))

    【讨论】:

    • 虽然这是一个不错的选择,但它并不能解释 OP 的问题。
    【解决方案2】:

    你需要做的:

    delete obj[Object.keys(obj)[i]] 
    

    delete Object.keys(obj)[i] 除外。现在您只是删除检索到的值name,而不是obj 的属性name 是obj["name"]。这就是为什么它从未从obj 中删除。这是一个 sn-p 示例:

    function removeString(obj) {
    
    var propertyArray = Object.values(obj);            
    for(var i = 0; i < propertyArray.length; i++)      
    if (typeof propertyArray[i] === "string")   
      delete obj[Object.keys(obj)[i]]                                 
    return obj;                                                                                       
    }
    
    
    
    var testObject = {size: 6, name: 'String', age: 20}
    
    console.log(removeString(testObject)) 

    【讨论】:

    • 它使用了很多不必要的资源。 (为每次迭代获取一组键,这可能很昂贵)。
    • @ibrahimmahrir 我只是使用 OP 提供的相同代码,这样就很清楚为什么他们的代码不起作用并显示如何修复它。是的,有更好的方法可以做到这一点,但我认为这将最清楚地向他们展示他们的初始代码出了什么问题。
    • 谢谢。我知道这不是完成所需输出的最佳方式。我知道我很接近,但无法弄清楚出了什么问题。感谢您的帮助。
    【解决方案3】:

    你的想法是对的。一个问题是您试图按索引删除键。对象没有与之关联的索引,它们是无序的。这意味着,与列表不同,您不能说 object[index],而是说 object[key]。

    您要做的是遍历每个 键,而不是值。然后您可以查找该值并进行比较,然后使用键调用delete。

    function removeString(obj) {
        var keys = Object.keys(obj);
    
        for(var i = 0; i < keys.length; i++) {
            if (typeof obj[keys[i]] === "string") {
                delete obj[keys[i]];
            }
        }
    
        return obj;
    }
    

    【讨论】:

    • 谢谢,我真的很喜欢你提供的替代方案以及随之而来的解释。
    猜你喜欢
    • 2012-01-08
    • 2016-03-21
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多