2012-10-12 35 views
10

tôi cần phải tạo ra một đối tượng mới lặp lại trên một mảng của các đối tượng mà ban đầu trông như thế này:Trích xuất từng giá trị của một tài sản duy nhất từ ​​một mảng các đối tượng trong jQuery

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

Tôi muốn kết quả là :

endObj = {0: true, 1: false} 

Tôi đã nghĩ đến việc sử dụng $.each nhưng sau đó tôi không biết cách tiếp tục từ đây. Bất kỳ gợi ý nào?

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

Câu hỏi của bạn yêu cầu cho kết quả là một đối tượng với các thuộc tính '0',' 1' vv, tuy nhiên điều này trông rất giống một mảng - và hầu hết các câu trả lời cho bạn trở lại một mảng không phải là một đối tượng. Bạn thực sự muốn trở lại điều gì? – Jamiec

+0

Đây không phải là một đối tượng jQuery, nó là một mảng đơn giản ... –

+0

@ FelixKling - vâng, nhưng OP đang sử dụng jquery '.each' để lặp qua nó. Và tại sao không? Nếu bạn đang sử dụng jQuery, bạn được tự do sử dụng 'each' để lặp lại nó. – Jamiec

Trả lời

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

Sống dụ: http://jsfiddle.net/8X48q/

+0

bị đánh đập theo giây :) +1 –

1

Trước hết, đó chỉ là nguồn gốc JS, không có jQuery cần thiết ở đây.

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

Đây là một lớp lót.

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

jsFiddle.

Nếu OP thực sự muốn một đối tượng (hay đúng hơn, không muốn một mảng) ...

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

jsFiddle.

+0

+1 cho giải pháp đơn giản nhất nếu OP thực sự muốn một mảng thay vì một đối tượng giả vờ là một mảng. – Jamiec

+0

@Jamiec Thêm thay thế nếu OP thực sự muốn một đối tượng. – alex

+0

Đây không phải là một lớp lót nếu bạn có định dạng mã tự động. – peter

0

Bạn đang không thực sự tạo ra một đối tượng ở đây, nhưng một mảng:

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

Nhưng để tránh globals, bạn có thể muốn sử dụng một 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

Đoạn mã đầu tiên có hình cầu thứ hai như thế nào? Nó dường như giống hệt với tôi, tại sao bạn làm cho nó phức tạp đến vậy? –

+0

Nó không thực sự globals trong trường hợp này, nhưng có nhiều cách bạn có thể đi với một IIFE trong một trường hợp như thế này: bọc nó trong một chức năng callable, và vượt qua một tên tài sản/tên tài sản, vượt qua như nhiều đối tượng như bạn muốn ,. .. đoạn mã này không thể làm những điều đó, chắc chắn, nhưng nó sẽ không đòi hỏi nhiều nỗ lực để thực hiện các tính năng mới theo cách này (IMO) –

+0

Ok ... nó giống như đoạn đầu tiên có một nhược điểm lớn mà bạn đã thử để bù đắp trong đoạn thứ hai.Btw, tôi không nghĩ rằng bạn cần phải chuyển đổi 'đối số' thành một mảng thích hợp, tôi nghĩ jQuery có thể xử lý các đối tượng giống như mảng một cách chính xác. –

-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

hoạt động của nó. Nhưng một giải pháp bẩn :) –

+0

Tôi sẽ nói * quá bẩn để gửi *;) – alex

+0

Yup bẩn của nó. Nhưng đó là một giải pháp. Nó có thể xảy ra. :) –

Các vấn đề liên quan