Pergunta

Suponha que eu tenho este código:

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

Agora, se eu queria remover "sobrenome"? .... existe algum equivalente a
myArray["lastname"].remove()?

(Eu preciso o elemento ido porque o número de elementos é importante e eu quero manter as coisas limpas.)

Foi útil?

Solução

Use a palavra-chave "delete" em JavaScript.

delete myArray["lastname"];

EDIT:

Em alguns motor de JavaScript, a palavra-chave de exclusão pode prejudicar o desempenho, uma vez que irá desfazer compilação / JIT otimização.

http://www.html5rocks.com/en/tutorials/speed/v8 / http://www.smashingmagazine.com/2012/11/ escrita-fast-memória-eficiente-javascript /

Outras dicas

Todos os objetos em JavaScript são implementados como tabelas de hash / arrays associativos. Então, o seguinte são o equivalente:

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

E, como já indicado, você "remover" uma propriedade de um objeto através da palavra-chave delete, que você pode usar de duas maneiras:

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

Hope a informação extra ajuda ...

Nenhuma das respostas anteriores abordar o fato de que o Javascript não tem matrizes associativas, para começar - não há nenhum tipo array como tal, consulte typeof .

O Javascript tem, são instâncias de objetos com propriedades dinâmicas. Quando as propriedades são confundidos com elementos de uma ocorrência de Array objeto, em seguida, coisas ruins ™ estão prestes a acontecer:

Problema

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)
}

Solução

Para ter uma função de remoção universal que não explodir em você, use:

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

que apenas remove exclui o objeto, mas ainda mantém o comprimento da matriz mesmo.

Para remover você precisa fazer algo como:

array.splice(index, 1);

Enquanto a resposta aceita é correto, ele está faltando a explicação por que ela funciona.

Em primeiro lugar, seu código deve refletir o fato de que este é não um array:

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

Note que todos os objetos (incluindo Arrays) pode ser usado desta forma. No entanto, não espere por funções padrão de matriz JS (POP, empurrão, ...) para trabalhar em objetos!

Como disse em resposta aceita, então você pode usar delete para remover as entradas de objetos:

delete myObject["lastname"]

Você deve decidir qual rota que você deseja tomar - ou objetos de uso (arrays associativos / dicionários) ou usar matrizes (mapas). Nunca misture os dois.

Uso método splice para remover completamente o produto a partir de uma matriz de objeto:

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");

Você está usando o objeto, você não está tendo uma matriz associativa para começar. Com uma matriz associativa, adicionando e removendo itens é a seguinte:

    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
    }

Como outras respostas têm notado, o que você está usando não é uma matriz Javascript, mas um objeto Javascript, que funciona quase como uma matriz associativa em outros idiomas, exceto que todas as chaves são convertidos para strings. O novo Mapa armazena chaves como seu modelo original .

Se você tivesse uma matriz e não um objeto, você pode usar o array função de filtro , para retornar uma nova matriz sem o item que deseja removidos:

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

Se você tiver um navegador mais antigo e jQuery, jQuery tem um $.grep método que funciona de forma semelhante :

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

Não é uma maneira elegante no Guia Airbnb Estilo de fazer isso (ES7):

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

Direitos de autor: https://codeburst.io / utilização-es2015-objeto-restante-operador-a-omitir-properties-38a3ecffe90

Se por qualquer motivo a tecla delete não está funcionando (como ele não estava funcionando para me)

Você pode emendar-lo e, em seguida, filtrar os valores indefinidos

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

não tente e cadeia-los desde splicing retorna elementos removidos;

Você pode remover um item do seu mapa, atribuindo-o para 'indefinido' explicitamente. Como no seu caso:

myArray [ "sobrenome"] = indefinido;

É muito simples se você tiver underscore.js dependência em seu projeto -

_.omit(myArray, "lastname")

Podemos usá-lo como uma função também. Angular joga algum erro se usado como um protótipo. Graças @HarpyWar. Ele me ajudou a resolver um problema.

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");

Ao utilizar o "delete" palavra-chave, ele irá apagar o elemento matriz de array em javascript.

Por exemplo,

Considere sequência de declarações.

var arrayElementToDelete = new Object();

arrayElementToDelete["id"]           = "XERTYB00G1"; 
arrayElementToDelete["first_name"]   = "Employee_one";
arrayElementToDelete["status"]       = "Active"; 

delete arrayElementToDelete["status"];

Última linha do código irá remover o elemento da matriz que é fundamental é "status" da matriz.

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);

Sem looping / Itera que obter o mesmo resultado

Para "Arrays":

Se você sabe o índice:

array.splice(index, 1);

Se você sabe o valor:

function removeItem(array, value) {
    var index = array.indexOf(value);
    if (index > -1) {
        array.splice(index, 1);
    }
    return array;
}

A resposta mais upvoted para delete funciona bem no caso de objetos, mas não para as matrizes reais. Se utilizar delete que remove elementos de circuitos, mas mantém o elemento como empty e comprimento de mudança matriz rotina. Isso pode ser um problema em alguns cenários.

Por exemplo, se eu fazer myArray.toString () em meuArray depois da remoção por meio de delete cria entrada vazio isto é ,,

O método só funciona para mim:

function removeItem (array, value) {
    var i = 0;
    while (i < array.length) {
        if(array[i] === value) {
            array.splice(i, 1);
        } else {
            ++i;
        }
    }
    return array;
}

uso:

var new = removeItem( ["apple","banana", "orange"],  "apple");
// ---> ["banana", "orange"]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top