Tengo este array:

var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});

es posible obtener el valor o un elemento específico de saber el nombre ?

algo como esto:

arr['k2'].value

o

arr.get('k1')
  • Tienen que probar esto ? : arr.k1
InformationsquelleAutor Omu | 2011-08-16

7 Comentarios

  1. 45

    Matrices normalmente se accede a través de índices numéricos, por lo que en su ejemplo arr[0] == {name:"k1", value:"abc"}. Si usted sabe que el name propiedad de cada objeto será única, se pueden almacenar en un objeto en lugar de una matriz, de la siguiente manera:

    var obj = {};
    obj["k1"] = "abc";
    obj["k2"] = "hi";
    obj["k3"] = "oa";
    
    alert(obj["k2"]); //displays "hi"

    Si lo que desea es una matriz de objetos como en tu post puede recorrer la matriz y de regreso al encontrar un elemento con un objeto que tiene la propiedad que usted desea:

    function findElement(arr, propName, propValue) {
      for (var i=0; i < arr.length; i++)
        if (arr[i][propName] == propValue)
          return arr[i];
    
      //will return undefined if not found; you could return a default instead
    }
    
    //Using the array from the question
    var x = findElement(arr, "name", "k2"); //x is {"name":"k2", "value":"hi"}
    alert(x["value"]); //displays "hi"
    
    var y = findElement(arr, "name", "k9"); //y is undefined
    alert(y["value"]); //error because y is undefined
    
    alert(findElement(arr, "name", "k2")["value"]); //displays "hi";
    
    alert(findElement(arr, "name", "zzz")["value"]); //gives an error because the function returned undefined which won't have a "value" property
    • Hay un pequeño error en su findElement función. El no uso de la variable de índice (i). debería ser: si (arr[i][nomprop] == … y en la vuelta
    • Gracias @Eystein. Fijo.
    • esto es realmente bueno 🙂
  2. 65

    Sé que esta pregunta es viejo, pero nadie ha mencionado una solución nativa todavía. Si usted no está tratando de apoyar arcaico de los navegadores (que no debería estar en este punto), puede utilizar array.filter:

    JS:

    var arr = [];
    arr.push({name:"k1", value:"abc"});
    arr.push({name:"k2", value:"hi"});
    arr.push({name:"k3", value:"oa"});
    
    var found = arr.filter(function(item) { return item.name === 'k1'; });
    
    console.log('found', found[0]);

    HTML:

    Check the console.

    Se puede ver un lista de navegadores compatibles aquí.

    En el futuro con ES6, usted será capaz de utilizar de la matriz.encontrar.

    • Tenga en cuenta: filter no permite la mutación de la matriz del contenido, que puede o no puede ser lo que usted desea.
  3. 19

    Encontrar un elemento

    Para encontrar el elemento con un nombre dado en una matriz puede utilizar buscar:

    arr.find(item=>item.name=="k1");

    Nota que find devuelve un único elemento (es decir, el primer partido):

    {
      "name": "k1",
      "value": "abc"
    }

    Encontrar todos los elementos

    En su matriz original sólo hay un elemento de ocurrencia de cada nombre.

    Si la matriz contiene varios elementos con el mismo nombre y desea a todos ellos, a continuación, utilizar filtro, que devolverá un array.

    JS:

    var arr = [];
    arr.push({name:"k1", value:"abc"});
    arr.push({name:"k2", value:"hi"});
    arr.push({name:"k3", value:"oa"});
    arr.push({name:"k1", value:"def"});
    
    var item;
    
    //find the first occurrence of item with name "k1"
    item = arr.find(item=>item.name=="k1");
    console.log(item);
    
    //find all occurrences of item with name "k1"
    //now item is an array
    item = arr.filter(item=>item.name=="k1");
    console.log(item);

    Encontrar índices de

    Del mismo modo, para los índices se pueden utilizar findIndex (para encontrar el primer partido) y filter + map encontrar todos los índices.

    JS:

    var arr = [];
    arr.push({name:"k1", value:"abc"});
    arr.push({name:"k2", value:"hi"});
    arr.push({name:"k3", value:"oa"});
    arr.push({name:"k1", value:"def"});
    
    var idx;
    
    //find index of the first occurrence of item with name "k1"
    idx = arr.findIndex(item=>item.name == "k1");
    console.log(idx, arr[idx].value);
    
    //find indices of all occurrences of item with name "k1"
    //now idx is an array
    idx = arr.map((item, i) => item.name == "k1" ? i : '').filter(String);
    console.log(idx);

  4. 18

    Para responder a su pregunta exacta se puede obtener el comportamiento exacto que desea mediante la ampliación de la Matriz prototipo con:

    Array.prototype.get = function(name) {
        for (var i=0, len=this.length; i<len; i++) {
            if (typeof this[i] != "object") continue;
            if (this[i].name === name) return this[i].value;
        }
    };

    esto agregará el método get() para todas las matrices y dejar de hacer lo que quiera, yo.e:

    arr.get('k1'); //= abc
  5. 3

    Usted no puede hacer lo que le estás pidiendo de forma nativa con una matriz, pero los objetos javascript se hash, así que se puede decir…

    var hash = {};
    hash['k1'] = 'abc';
    ...

    Entonces usted puede recuperar mediante un soporte o la notación de punto:

    alert(hash['k1']); //alerts 'abc'
    alert(hash.k1); //also alerts 'abc'

    Para las matrices, consulte la underscore.js biblioteca en general y de la detectar método en particular. El uso de detectar se podría hacer algo como…

    _.detect(arr, function(x) { return x.name == 'k1' });

    O, más en general

    MyCollection = function() {
      this.arr = [];
    }
    
    MyCollection.prototype.getByName = function(name) {
      return _.detect(this.arr, function(x) { return x.name == name });
    }
    
    MyCollection.prototype.push = function(item) {
      this.arr.push(item);
    }
    
    etc...
    • «Usted no puede hacer lo que le estás pidiendo de forma nativa con una matriz» es incorrecta, usted puede agregar arr.get(‘k1’) mediante la modificación de la Matriz de prototipo.
  6. 2

    No sé nada acerca de jquery así que no puedo ayudarte con eso, pero en cuanto a Javascript se refiere usted tiene una matriz de objetos, de modo que lo que usted sólo será capaz de acceder a los nombres & valores a través de cada elemento de la matriz. E. g arr[0].name le dará 'k1', arr[1].value le dará 'hi'.

    Tal vez usted quiere hacer algo como:

    var obj = {};
    
    obj.k1 = "abc";
    obj.k2 = "hi";
    obj.k3 = "oa";
    
    alert ("obj.k2:" + obj.k2);
  7. 0

    El enfoque más fácil que he utilizado es

    var found = arr.find(function(element) {
             return element.name === "k1";
     });
    
    //If you print the found :
    console.log(found);
    => Object { name: "k1", value: "abc" }
    
    //If you need the value
    console.log(found.value)
    => "abc"

    El enfoque similar puede ser usado para encontrar los valores de la Matriz JSON basa en los datos de entrada desde el JSON.

Dejar respuesta

Please enter your comment!
Please enter your name here