2012-10-12 2 views
10

Ich brauche ein neues Objekt Iterieren über ein Array von Objekten zu erstellen, die zunächst wie folgt aussieht:jeden Wert einer einzelnen Eigenschaft aus einem Array von Objekten in jQuery

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

Ich würde das Ergebnis gefällt werden :

endObj = {0: true, 1: false} 

ich $.each verwenden dachte aber dann weiß ich nicht, wie von hier zu gehen. Irgendwelche Hinweise?

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

Ihre Frage geht dahin, Damit das Ergebnis ein Objekt mit den Eigenschaften '0', '1' usw. ist, sieht das jedoch sehr nach einem Array aus - und die meisten Antworten geben ein Array zurück, kein Objekt. Was willst du eigentlich zurück? – Jamiec

+0

Dies ist kein jQuery-Objekt, es ist ein einfaches Array ... –

+0

@FelixKling - Ja, aber OP verwendet jquery '.each', um darüber zu iterieren. Und warum nicht? Wenn Sie jQuery verwenden, können Sie 'each' verwenden, um es zu iterieren. – Jamiec

Antwort

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

anschauliches Beispiel: http://jsfiddle.net/8X48q/

+0

geschlagen von Sekunden :) +1 –

1

Zunächst einmal, das ist nur einheimische JS, gibt es keine jQuery hier benötigt.

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

Hier ist ein Einzeiler.

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

jsFiddle.

Wenn die OP wirklich ein Objekt will (oder besser gesagt, will nicht einen Array) ...

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

jsFiddle.

+0

+1 für die einfachste Lösung, wenn das OP tatsächlich ein Array und nicht ein Objekt, das vorgibt, ein Array sein will. – Jamiec

+0

@Jamiec Die Alternative hinzugefügt, wenn das OP wirklich ein Objekt will. – alex

+0

Dies ist kein Einzeiler, wenn Sie automatische Codeformatierung haben. – peter

0

Sie sind nicht wirklich ein Objekt hier schaffen, sondern ein Array:

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

Aber Globals zu vermeiden, könnten Sie eine IIFE verwenden möchten:

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

Wie enthält das erste Snippet Globals, die das zweite vermeidet? Es scheint mir genau dasselbe zu sein, warum machst du es so kompliziert? –

+0

In diesem Fall handelt es sich nicht wirklich um globale Variablen, aber in einem solchen Fall gibt es mehrere Möglichkeiten, die Sie mit einem IIFE ausführen können: Umbrechen Sie ihn in eine aufrufbare Funktion und übergeben Sie einen Eigenschaftsnamen/Eigenschaftsnamen, übergeben Sie so viele Objekte wie Sie möchten. .. dieses Snippet kann diese Dinge noch nicht tun, sicher, aber es wird nicht so viel Aufwand erfordern, um neue Features auf diese Weise zu implementieren (IMO) –

+0

Ok ... es klang wie das erste Snippet hatte einen großen Nachteil, den Sie versucht haben im zweiten Ausschnitt kompensieren.Übrigens, ich glaube nicht, dass Sie 'Argumente' in ein richtiges Array konvertieren müssen. Ich denke, dass jQuery array-ähnliche Objekte richtig verarbeiten kann. –

-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

funktioniert. Aber eine dreckige Lösung :) –

+0

würde ich sagen * zu schmutzig zum Posten *;) – alex

+0

Yup ist dreckig. Aber es ist eine Lösung. So kann es stattfinden. :) –

Verwandte Themen