首页 文章

如何从javascript关联数组中删除对象?

提问于
浏览
537

假设我有这个代码:

var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

现在,如果我想删除"lastname"?....有一些相当于
myArray["lastname"].remove()

(我需要元素消失,因为元素的数量很重要,我想保持干净 . )

15 回答

  • 26

    在Javascript中使用“delete”关键字 .

    delete myArray["lastname"];
    

    编辑:

    在某些JavaScript引擎中,delete关键字可能会损害性能,因为它会撤消编译/ JIT优化 .

    http://www.html5rocks.com/en/tutorials/speed/v8/ http://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/

  • 5

    JavaScript中的所有对象都实现为哈希表/关联数组 . 所以,以下是等价的:

    alert(myObj["SomeProperty"]);
    alert(myObj.SomeProperty);
    

    并且,如前所述,您通过 delete 关键字从对象获取属性,您可以通过两种方式使用它:

    delete myObj["SomeProperty"];
    delete myObj.SomeProperty;
    

    希望额外的信息有助于......

  • 2

    之前的答案都没有解决Javascript没有开始的关联数组的事实 - 没有 array 类型,请参阅typeof .

    Javascript有什么,是具有动态属性的对象实例 . 当属性与Array对象实例的元素混淆时,Bad Things™必然会发生:

    问题

    var elements = new Array()
    
    elements.push(document.getElementsByTagName("head")[0])
    elements.push(document.getElementsByTagName("title")[0])
    elements["prop"] = document.getElementsByTagName("body")[0]
    
    console.log("number of elements: ", elements.length)   // returns 2
    delete elements[1]
    console.log("number of elements: ", elements.length)   // returns 2 (?!)
    
    for (var i = 0; i < elements.length; i++)
    {
       // uh-oh... throws a TypeError when i == 1
       elements[i].onmouseover = function () { window.alert("Over It.")}
       console.log("success at index: ", i)
    }
    

    解决方案

    要拥有一个不会爆炸的通用删除功能,请使用:

    Object.prototype.removeItem = function (key) {
       if (!this.hasOwnProperty(key))
          return
       if (isNaN(parseInt(key)) || !(this instanceof Array))
          delete this[key]
       else
          this.splice(key, 1)
    };
    
    //
    // Code sample.
    //
    var elements = new Array()
    
    elements.push(document.getElementsByTagName("head")[0])
    elements.push(document.getElementsByTagName("title")[0])
    elements["prop"] = document.getElementsByTagName("body")[0]
    
    console.log(elements.length)                        // returns 2
    elements.removeItem("prop")
    elements.removeItem(0)
    console.log(elements.hasOwnProperty("prop"))        // returns false as it should
    console.log(elements.length)                        // returns 1 as it should
    
  • 5

    这只会删除删除对象,但仍保持数组长度相同 .

    要删除您需要执行以下操作:

    array.splice(index, 1);
    
  • 3

    虽然接受的答案是正确的,但它缺少解释为什么它的工作原理 .

    首先,您的代码应该反映出 NOT 数组的事实:

    var myObject = new Object();
    myObject["firstname"] = "Bob";
    myObject["lastname"] = "Smith";
    myObject["age"] = 25;
    

    请注意,所有对象(包括 Array s)都可以这种方式使用 . 但是,不要指望标准的JS数组函数(pop,push,...)来处理对象!

    如接受的答案中所述,您可以使用 delete 从对象中删除条目:

    delete myObject["lastname"]
    

    您应该决定要使用哪条路径 - 使用对象(关联数组/字典)或使用数组(映射) . 永远不要混合他们两个 .

  • 72

    使用方法 splice 从对象数组中完全删除项:

    Object.prototype.removeItem = function (key, value) {
        if (value == undefined)
            return;
    
        for (var i in this) {
            if (this[i][key] == value) {
                this.splice(i, 1);
            }
        }
    };
    
    var collection = [
        { id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
        { id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
        { id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
    ];
    
    collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");
    
  • 2

    您正在使用Object,您没有开始使用关联数组 . 使用关联数组,添加和删除项目如下所示:

    Array.prototype.contains = function(obj) 
        {
            var i = this.length;
            while (i--) 
            {
                if (this[i] === obj) 
                {
                    return true;
                }
            }
            return false;
        }
    
    
        Array.prototype.add = function(key, value) 
        {
            if(this.contains(key))
                this[key] = value;
            else
            {
                this.push(key);
                this[key] = value;
            }
        }
    
    
        Array.prototype.remove = function(key) 
        {
            for(var i = 0; i < this.length; ++i)
            {
                if(this[i] == key)
                {
                    this.splice(i, 1);
                    return;
                }
            }
        }
    
    
    
        // Read a page's GET URL variables and return them as an associative array.
        function getUrlVars()
        {
            var vars = [], hash;
            var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    
            for(var i = 0; i < hashes.length; i++)
            {
                hash = hashes[i].split('=');
                vars.push(hash[0]);
                vars[hash[0]] = hash[1];
            }
    
            return vars;
        }
    
    
    
        function ForwardAndHideVariables() {
            var dictParameters = getUrlVars();
    
            dictParameters.add("mno", "pqr");
            dictParameters.add("mno", "stfu");
    
            dictParameters.remove("mno");
    
    
    
            for(var i = 0; i < dictParameters.length; i++)
            {
                var key = dictParameters[i];
                var value = dictParameters[key];
                alert(key + "=" + value);
            }
            // And now forward with HTTP-POST
            aa_post_to_url("Default.aspx", dictParameters);
        }
    
    
        function aa_post_to_url(path, params, method) {
            method = method || "post";
    
            var form = document.createElement("form");
    
            //move the submit function to another variable
            //so that it doesn't get written over if a parameter name is 'submit'
            form._submit_function_ = form.submit;
    
            form.setAttribute("method", method);
            form.setAttribute("action", path);
    
            for(var i = 0; i < params.length; i++)
            {
                var key = params[i];
    
                var hiddenField = document.createElement("input");
                hiddenField.setAttribute("type", "hidden");
                hiddenField.setAttribute("name", key);
                hiddenField.setAttribute("value", params[key]);
    
                form.appendChild(hiddenField);
            }
    
            document.body.appendChild(form);
            form._submit_function_(); //call the renamed function
        }
    
  • 1

    正如其他答案所指出的那样,你使用的不是Javascript数组,而是一个Javascript对象,它的工作方式几乎就像其他语言中的关联数组,除了所有键都转换为字符串 . 新的Map将密钥存储为其原始类型 .

    如果您有一个数组而不是一个对象,则可以使用该数组的.filter函数返回一个没有要删除的项目的新数组:

    var myArray = ['Bob', 'Smith', 25];
    myArray = myArray.filter(function(item) {
        return item !== 'Smith';
    });
    

    如果你有一个较旧的浏览器和jQuery,jQuery有一个$.grep method类似的工作:

    myArray = $.grep(myArray, function(item) {
        return item !== 'Smith';
    });
    
  • 1018

    您可以通过明确地将其指定为“未定义”来从 Map 中删除条目 . 在你的情况下:

    myArray [“lastname”] =未定义;

  • 39

    如果由于某种原因删除键不起作用(就像它不适合我)

    您可以将其拼接出来,然后过滤未定义的值

    // to cut out one element via arr.splice(indexToRemove, numberToRemove);
    array.splice(key, 1)
    array.filter(function(n){return n});
    

    不要尝试链接它们,因为splice返回被删除的元素;

  • 2

    如果您的项目中存在underscore.js依赖项,那么它非常直接 -

    _.omit(myArray, "lastname")
    
  • 14

    我们也可以将它用作功能 . 如果用作原型,Angular会抛出一些错误 . 谢谢@HarpyWar . 它帮助我解决了一个问题 .

    var removeItem = function (object, key, value) {
        if (value == undefined)
            return;
    
        for (var i in object) {
            if (object[i][key] == value) {
                object.splice(i, 1);
            }
        }
    };
    
    var collection = [
        { id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
        { id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
        { id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
    ];
    
    removeItem(collection, "id", "87353080-8f49-46b9-9281-162a41ddb8df");
    
  • 7

    通过使用 "delete" 关键字,它将在javascript中从数组中删除数组元素 .

    例如,

    考虑以下陈述 .

    var arrayElementToDelete = new Object();
    
    arrayElementToDelete["id"]           = "XERTYB00G1"; 
    arrayElementToDelete["first_name"]   = "Employee_one";
    arrayElementToDelete["status"]       = "Active"; 
    
    delete arrayElementToDelete["status"];
    

    代码的最后一行将从数组中删除密钥为“status”的数组元素 .

  • 0

    Airbnb风格指南中有一种优雅的方式可以做到这一点(ES7):

    const myObject = {
      a: 1,
      b: 2,
      c: 3
    };
    const { a, ...noA } = myObject;
    console.log(noA); // => { b: 2, c: 3 }
    

    版权:https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90

  • 1
    var myArray = newmyArray = new Object(); 
    myArray["firstname"] = "Bob";
    myArray["lastname"] = "Smith";
    myArray["age"] = 25;
    
    var s = JSON.stringify(myArray);
    
    s.replace(/"lastname[^,}]+,/g,'');
    newmyArray = JSON.parse(p);
    

    没有循环/迭代,我们得到相同的结果

相关问题