2011-01-14 9 views
68

El código de abajo viene de interfaz de usuario jQuery Autocompletar:¿Cómo cambiar el valor del objeto que está dentro de una matriz usando JavaScript o jQuery?

var projects = [ 
    { 
     value: "jquery", 
     label: "jQuery", 
     desc: "the write less, do more, JavaScript library", 
     icon: "jquery_32x32.png" 
    }, 
    { 
     value: "jquery-ui", 
     label: "jQuery UI", 
     desc: "the official user interface library for jQuery", 
     icon: "jqueryui_32x32.png" 
    }, 
    { 
     value: "sizzlejs", 
     label: "Sizzle JS", 
     desc: "a pure-JavaScript CSS selector engine", 
     icon: "sizzlejs_32x32.png" 
    } 
]; 

Por ejemplo, quiero cambiar el valor la descripción de jquery-ui. ¿Cómo puedo hacer eso?

Además, ¿hay una forma más rápida de obtener los datos? Me refiero a darle un nombre al objeto para obtener sus datos, al igual que el objeto dentro de una matriz? Por lo tanto, sería algo así como jquery-ui.jquery-ui.desc = ....

+0

Debería transformar la matriz en un objeto Javascript para usar la sintaxis 'projects [" jquery-ui "]. Desc'. ¿Valdría la pena el esfuerzo solo para obtener una sintaxis más agradable? –

+0

He actualizado mi solución con su última pregunta. Y puede usar la notación "projects.jquery-ui.desc". – Aston

Respuesta

57

Tienes que buscar en la matriz como:

function changeDesc(value, desc) { 
    for (var i in projects) { 
    if (projects[i].value == value) { 
     projects[i].desc = desc; 
     break; //Stop this loop, we found it! 
    } 
    } 
} 

y utilizarlo como

var projects = [ ... ]; 
changeDesc ('jquery-ui', 'new description'); 

ACTUALIZACIÓN:

conseguirlo más rápido :

var projects = { 
    jqueryUi : { 
     value: 'lol1', 
     desc: 'lol2' 
    } 
}; 

projects.jqueryUi.desc = 'new string'; 

(En acuerdo con el comentario de Frédéric no se debe utilizar guión en la clave de objeto, o se debe utilizar "jquery-ui" y proyectos [ "jquery-ui"] notación.)

+0

¿Hay una forma mucho más rápida de obtener los datos? Me refiero a darle un nombre al objeto para buscar sus datos. Al igual que el objeto dentro de la matriz. Entonces, ¿puedo usarlo de esa manera ?: jquery-ui.jquery-ui.desc = .... – qinHaiXiang

+0

sí, cree un objeto en lugar de una matriz – Aston

+1

su actualización no funcionará debido al guión '-' en el nombre del objeto. Tendría que escribir '" jquery-ui ": {}' y 'projects [" jquery-ui "]. Desc' respectivamente. –

10

lo que necesita saber el índice del objeto que está cambiando. entonces su bastante simple

projects[1].desc= "new string"; 
28

Se puede utilizar $.each() para iterar sobre la matriz y localizar el objeto que le interesa:

$.each(projects, function() { 
    if (this.value == "jquery-ui") { 
     this.desc = "Your new description"; 
    } 
}); 
12

es fácilmente se puede lograr con subrayado/biblioteca lodash:

_.chain(projects) 
    .find({value:"jquery-ui"}) 
    .merge({desc: "new desc"}); 

Docs:
https://lodash.com/docs#find
https://lodash.com/docs#merge

+0

¿Qué pasa si la función de búsqueda no encuentra 'jquery-ui'? – Mika

+0

La propiedad 'buscar' no existe en el tipo 'LoDashExplicitArrayWrapper' – AndrewBenjamin

+0

El resultado de tales secuencias se debe desenvolver con el valor _ #. https://lodash.com/docs/4.17.4#chain '.value()' –

-1

actualizar varios elementos con los partidos utilizan:

_.chain(projects).map(item => { 
     item.desc = item.value === "jquery-ui" ? "new desc" : item.desc; 
     return item; 
    }) 
0

probar este código. se utiliza la función grep jQuery

array = $.grep(array, function (a) { 
    if (a.Id == id) { 
     a.Value= newValue; 
    } 
    return a; 
}); 
+0

¿Existe algún problema con mi código para el que no se votó? –

50

Es bastante simple

  • Encuentra el índice del objeto utilizando findIndex método.
  • Almacene el índice en variable.
  • hacer una actualización simple como esto: yourArray[indexThatyouFind]

//Initailize array of objects. 
 
let myArray = [ 
 
    {id: 0, name: "Jhon"}, 
 
    {id: 1, name: "Sara"}, 
 
    {id: 2, name: "Domnic"}, 
 
    {id: 3, name: "Bravo"} 
 
], 
 
    
 
//Find index of specific object using findIndex method.  
 
objIndex = myArray.findIndex((obj => obj.id == 1)); 
 

 
//Log object to Console. 
 
console.log("Before update: ", myArray[objIndex]) 
 

 
//Update object's name property. 
 
myArray[objIndex].name = "Laila" 
 

 
//Log object to console again. 
 
console.log("After update: ", myArray[objIndex])

+1

¿Alguna razón para el doble '()' en el método 'findIndex'? – Terkhos

+1

solo por legibilidad: D –

-1

Ésta es mi respuesta al problema. Mi versión de guión bajo fue 1.7, por lo tanto, no pude usar .findIndex. Así que manualmente obtuve el índice del artículo y lo reemplacé. Aquí está el código para el mismo.

var students = [ 
{id:1,fName:"Ajay", lName:"Singh", age:20, sex:"M" }, 
{id:2,fName:"Raj", lName:"Sharma", age:21, sex:"M" }, 
{id:3,fName:"Amar", lName:"Verma", age:22, sex:"M" } 
{id:4,fName:"Shiv", lName:"Singh", age:22, sex:"M" } 
     ] 

A continuación método reemplazará al estudiante con id: 4 con más atributos en el objeto

function updateStudent(id) { 
var indexOfRequiredStudent = -1; 
    _.each(students,function(student,index) {      
     if(student.id === id) {       
      indexOfRequiredStudent = index; return;  
     }}); 
students[indexOfRequiredStudent] = _.extend(students[indexOfRequiredStudent], 
        {class:"First Year",branch:"CSE"});   

}

Con subrayado 1.8 se puede simplificar como tenemos métodos _.findIndexOf.

0

puede utilizar .find por lo que en el ejemplo

var projects = [ 
      { 
       value: "jquery", 
       label: "jQuery", 
       desc: "the write less, do more, JavaScript library", 
       icon: "jquery_32x32.png" 
      }, 
      { 
       value: "jquery-ui", 
       label: "jQuery UI", 
       desc: "the official user interface library for jQuery", 
       icon: "jqueryui_32x32.png" 
      }, 
      { 
       value: "sizzlejs", 
       label: "Sizzle JS", 
       desc: "a pure-JavaScript CSS selector engine", 
       icon: "sizzlejs_32x32.png" 
      } 
     ]; 

let project = projects.find((p) => { 
    return p.value === 'jquery-ui'; 
}); 

project.desc = 'your value' 
0

También podemos usar la función de mapa de Array para modificar objeto de una matriz mediante Javascript.

function changeDesc(value, desc){ 
    projects.map((project) => project.value == value ? project.desc = desc : null) 
} 

changeDesc('jquery', 'new description') 
1

// using higher-order functions to avoiding mutation 
 
var projects = [ 
 
      { 
 
       value: "jquery", 
 
       label: "jQuery", 
 
       desc: "the write less, do more, JavaScript library", 
 
       icon: "jquery_32x32.png" 
 
      }, 
 
      { 
 
       value: "jquery-ui", 
 
       label: "jQuery UI", 
 
       desc: "the official user interface library for jQuery", 
 
       icon: "jqueryui_32x32.png" 
 
      }, 
 
      { 
 
       value: "sizzlejs", 
 
       label: "Sizzle JS", 
 
       desc: "a pure-JavaScript CSS selector engine", 
 
       icon: "sizzlejs_32x32.png" 
 
      } 
 
     ]; 
 

 
// using higher-order functions to avoiding mutation 
 
index = projects.findIndex(x => x.value === 'jquery-ui'); 
 
[... projects.slice(0,index), {'x': 'xxxx'}, ...projects.slice(index + 1, projects.length)];

0

Encuentra primero el índice:

function getIndex(array, key, value) { 
     var found = false; 
     var i = 0; 
     while (i<array.length && !found) { 
      if (array[i][key]==value) { 
      found = true; 
      return i; 
      } 
      i++; 
     } 
     } 

continuación:

console.log(getIndex($scope.rides, "_id", id)); 

Luego hacer lo que quiera con este índice, como:

$ scope [returnedindex] .someKey = "someValue";

Nota: no lo utilice, ya que para comprobar todos los documentos de la matriz, utilice mientras que con un tope, por lo que se detendrá una vez que se encuentre, por lo tanto, un código más rápido.

Cuestiones relacionadas