2012-10-12 67 views
10

Necesito crear un nuevo objeto interactuando sobre una matriz de objetos que en un principio es el siguiente:Extracto de cada valor de una propiedad única de una serie de objetos en jQuery

startObj = [{'prop': true}, {'prop': false}]; 

me gustaría que el resultado sea :

endObj = {0: true, 1: false} 

estaba pensando usar $.each pero luego no sé cómo proceder desde aquí. ¿Algún consejo?

$.each([{'prop': true}, {'prop': false}], function (i, o) { 
    var newObj; 
    // the new object should look like this 
    // newObj = {0: true, 1: false} 
}); 
+0

Su pregunta se refiere para que el resultado sea un objeto con las propiedades '0',' 1' etc., sin embargo, esto se parece mucho a una matriz, y la mayoría de las respuestas te devuelve una matriz, no un objeto. ¿Qué es lo que realmente quieres volver? – Jamiec

+0

Este no es un objeto jQuery, es una matriz simple ... –

+0

@FelixKling - sí, pero OP está usando jquery '.each' para iterar sobre él. ¿Y por qué no? Si está utilizando jQuery, puede usar 'each' para iterarlo. – Jamiec

Respuesta

7
var newObj = {}; 
$.each([{'prop': true}, {'prop': false}], function (i, o) { 
    newObj[i] = o.prop; 
}); 

ejemplo vivo: http://jsfiddle.net/8X48q/

+0

golpeado por segundos :) +1 –

1

En primer lugar, eso es sólo nativa JS, no hay jQuery para continuar.

var startObj = [{'prop': true}, {'prop': false}], 
    endObj = [], // This could also be {} if you want but if you just have an array in startObj, it doesn't make much sense 
    i = 0, 
    i_max = startObj.length; 

for (i; i < i_max; i++) { 
    endObj.push(startObj[i].prop); 
    // if you changed endObj to be {} then use the following line instead of the one above 
    // endObj[i] = startObj[i].prop; 
} 
12

Aquí hay un trazador de líneas.

var newObj = $.map(oldObj, function(val) { return val.prop; }); 

jsFiddle.

Si el PO quiere realmente un objeto (o más bien, no quiere una matriz) ...

var newObj = $.extend({}, $.map(oldObj, function(val) { return val.prop; })); 

jsFiddle.

+0

+1 para la solución más simple si el OP realmente quiere una matriz en lugar de un objeto que pretende ser una matriz. – Jamiec

+0

@Jamiec Se agregó la alternativa si el OP realmente quiere un objeto. – alex

+0

Esto no es de una sola línea si tiene formato de código automático. – peter

0

usted no es realmente la creación de un objeto aquí, pero una matriz:

var newObj = [];//array 
$.each([{'prop': true}, {'prop': false}], function (i, o) 
{ 
    newObj[i] = o.prop 
}); 

Pero para evitar globales, es posible que desee utilizar un IIFE:

var newObj = (function() 
{//takes any amount of objects as argument 
    var returnArray = []; 
    var argumentsToArray = Array.prototype.slice.apply(arguments,[0]);//create array of objects passed 
    $.each(argumentsToArray, function (i, o) 
    { 
     returnArray[i] = o.prop 
    }); 
    return returnArray;//is assigned to newObj 
})({'prop': true}, {'prop': false});//1 obj, 2, 3, 4, 5... doesn't matter 
+0

¿Cómo tiene el primer fragmento global que el segundo evita? Parece ser exactamente lo mismo para mí, ¿por qué lo haces tan complicado? –

+0

No son realmente globales en este caso, pero hay más formas de ir con un IIFE en un caso como este: envolverlo en una función invocable y pasar un nombre de propiedad/nombre de propiedad, pasar tantos objetos como desee. .. este fragmento todavía no puede hacer esas cosas, seguro, pero no requerirá tanto esfuerzo implementar nuevas características de esta manera (IMO) –

+0

Ok ... sonó como si el primer fragmento tuviera un inconveniente importante que intentaste para compensar en el segundo fragmento.Por cierto, no creo que tengas que convertir 'arguments' en una matriz adecuada, creo que jQuery puede manejar objetos tipo array correctamente. –

-3
var obj = "{"; 
$.each([{'prop': true}, {'prop': false}], function (index, o) { 
    obj += '"' + index + '":' + o.prop + ","; 
}); 
var newObj = obj.substring(0, obj.length - 1); 
newObj += "}"; 
console.log(newObj); 
console.log($.parseJSON(newObj)); 
​ 
+0

su funcionamiento. Pero una solución sucia :) –

+0

Yo diría * demasiado sucio para publicar *;) – alex

+0

Yup está sucio. Pero es una solución. Entonces puede tener lugar. :) –

Cuestiones relacionadas