Làm cách nào để chuyển đổi mảng Đối tượng thành một Đối tượng trong JavaScript?


102

Tôi có một mảng các đối tượng:

[ 
  { key : '11', value : '1100', $$hashKey : '00X' },
  { key : '22', value : '2200', $$hashKey : '018' }
];

Làm cách nào để chuyển nó thành mã sau bằng JavaScript?

{
  "11": "1000",
  "22": "2200"
}

4
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})
david

Câu trả lời:


52

Có thể bạn đang tìm kiếm một cái gì đó như thế này:

// original
var arr = [ 
  {key : '11', value : '1100', $$hashKey : '00X' },
  {key : '22', value : '2200', $$hashKey : '018' }
];

//convert
var result = {};
for (var i = 0; i < arr.length; i++) {
  result[arr[i].key] = arr[i].value;
}

console.log(result);


2
Hãy xem câu trả lời của FirstOne để biết cách tiếp cận hiện đại.
Tibos

134

Giải pháp ES6 tí hon có thể giống như sau:

var arr = [{key:"11", value:"1100"},{key:"22", value:"2200"}];
var object = arr.reduce(
  (obj, item) => Object.assign(obj, { [item.key]: item.value }), {});

console.log(object)

Ngoài ra, nếu bạn sử dụng đối tượng spread, nó có thể trông giống như:

var object = arr.reduce((obj, item) => ({...obj, [item.key]: item.value}) ,{});

Một giải pháp khác nhanh hơn 99% là (thử nghiệm trên jsperf):

var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});

Ở đây chúng tôi được hưởng lợi từ toán tử dấu phẩy, nó đánh giá tất cả biểu thức trước dấu phẩy và trả về một biểu thức cuối cùng (sau dấu phẩy cuối cùng). Vì vậy, chúng tôi không sao chép objmỗi lần, thay vì gán thuộc tính mới cho nó.


2
Yêu một người! var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Sohail

Đây là một dòng nhanh hơn hay vòng lặp thông thường?
Jeb50

2
@ Jeb50, vòng lặp thông thường là nhanh nhất, nhưng không nhiều qua toán tử dấu phẩy. Object.assign / nhà điều hành lây lan là một thứ tự cường độ chậm hơn: jsperf.com/comma-operator-js
Josh Geller

1
Bạn đã quên rải vật thể thứ hai({...obj, ...{[item.key]: item.value}}) ,{});
Julia

Cảm ơn, gói này trong một đối tượng thực sự là không bắt buộc. Tôi đã sưa nó.
Shevchenko Viktor

59

Tôi thích cách tiếp cận chức năng để đạt được nhiệm vụ này:

var arr = [{ key:"11", value:"1100" }, { key:"22", value:"2200" }];
var result = arr.reduce(function(obj,item){
  obj[item.key] = item.value; 
  return obj;
}, {});

Lưu ý: Cuối cùng {}objgiá trị ban đầu cho hàm giảm, nếu bạn không cung cấp giá trị ban đầu, arrphần tử đầu tiên sẽ được sử dụng (điều này có thể không mong muốn).

https://jsfiddle.net/GreQ/2xa078da/


2
và nếu khóa là động?
Stefano Saitta

1
Chà, bạn nên biết thuộc tính nào của mục / đối tượng đã cho nên được sử dụng làm khóa và thuộc tính nào là giá trị không? Nhưng nếu chúng ta giả sử rằng wfirst prop luôn là khóa và giá trị thứ hai thì chúng ta có thể sử dụng một hàm gọi lại như sau: function (obj, item) {var key = item.keys (); obj [item [key [0]]] = item [key [0]]; trả lại obj; }
GreQ

Sửa lệnh gọi lại ở trên: code var obj = arr.reduce (function (obj, item) {var key = Object.keys (item); obj [item [key [0]]] = item [key [1]]; return obj;}, {});
GreQ

58

Đang cố gắng sửa câu trả lời này trong Làm cách nào để chuyển đổi mảng Đối tượng thành một Đối tượng trong JavaScript? ,

điều này nên làm điều đó:

var array = [
    {key:'k1',value:'v1'},
    {key:'k2',value:'v2'},
    {key:'k3',value:'v3'}
];
var mapped = array .map(item => ({ [item.key]: item.value }) );
var newObj = Object.assign({}, ...mapped );
console.log(newObj );


Lót:

var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));

18

Sử dụng Object.fromEntries :

const array = [
    { key: "key1", value: "value1" },
    { key: "key2", value: "value2" },
];

const obj = Object.fromEntries(array.map(item => [item.key, item.value]));

console.log(obj);


12

Một cách rõ ràng để thực hiện việc này bằng JavaScript hiện đại như sau:

const array = [
  { name: "something", value: "something" },
  { name: "somethingElse", value: "something else" },
];

const newObject = Object.assign({}, ...array.map(item => ({ [item.name]: item.value })));

// >> { something: "something", somethingElse: "something else" }


5

Dựa trên các câu trả lời do nhiều tác giả gợi ý, tôi đã tạo một kịch bản kiểm tra JsPref. https://jsperf.com/array2object82364

Dưới đây là ảnh chụp màn hình của hiệu suất. Tôi hơi sốc khi thấy, kết quả chrome trái ngược với firefox và edge, ngay cả sau khi chạy nó vài lần.

Cạnh

Firefox

Trình duyệt Chrome


2

Sử dụng Underscore.js :

var myArray = [
  Object { key="11", value="1100", $$hashKey="00X"},
  Object { key="22", value="2200", $$hashKey="018"}
];
var myObj = _.object(_.pluck(myArray, 'key'), _.pluck(myArray, 'value'));

2

Cập nhật: Thế giới tiếp tục quay. Thay vào đó, hãy sử dụng một cách tiếp cận chức năng.

Của bạn đây:

var arr = [{ key: "11", value: "1100" }, { key: "22", value: "2200" }];
var result = {};
for (var i=0, len=arr.length; i < len; i++) {
    result[arr[i].key] = arr[i].value;
}
console.log(result); // {11: "1000", 22: "2200"}

Câu trả lời này giống với câu trả lời mà ai đó đã đăng 5 phút trước một cách đáng ngạc nhiên
Alexander

1
Vì đó là cách bạn giải quyết vấn đề này. Về cách đặt tên chẳng hạn: arraylà từ khóa dành riêng nên mọi người dùng arrthay thế. vv
pstadler

0

Đây là cách chấp nhận động ở trên dưới dạng một chuỗi và nội suy nó thành một đối tượng:

var stringObject = '[Object { key="11", value="1100", $$hashKey="00X"}, Object { key="22", value="2200", $$hashKey="018"}]';

function interpolateStringObject(stringObject) {
  var jsObj = {};
  var processedObj = stringObject.split("[Object { ");
  processedObj = processedObj[1].split("},");
  $.each(processedObj, function (i, v) {
      jsObj[v.split("key=")[1].split(",")[0]] = v.split("value=")[1].split(",")[0].replace(/\"/g,'');
  });

  return jsObj
}

var t = interpolateStringObject(stringObject); //t is the object you want

http://jsfiddle.net/3QKmX/1/


0

// original
var arr = [{
    key: '11',
    value: '1100',
    $$hashKey: '00X'
  },
  {
    key: '22',
    value: '2200',
    $$hashKey: '018'
  }
];

// My solution
var obj = {};
for (let i = 0; i < arr.length; i++) {
  obj[arr[i].key] = arr[i].value;
}
console.log(obj)


Mặc dù điều này có thể trả lời câu hỏi, nhưng tốt hơn là thêm một số mô tả về cách câu trả lời này có thể giúp giải quyết vấn đề. Vui lòng đọc Làm thế nào để tôi viết một câu trả lời tốt để biết thêm.
Roshana Pitigala

0

Bạn có thể sử dụng chức năng mapKeys lodash cho việc đó. Chỉ một dòng mã!

Vui lòng tham khảo mẫu mã hoàn chỉnh này (sao chép, dán mã này vào repl.it hoặc tương tự):

import _ from 'lodash';
// or commonjs:
// const _ = require('lodash');

let a = [{ id: 23, title: 'meat' }, { id: 45, title: 'fish' }, { id: 71, title: 'fruit' }]
let b = _.mapKeys(a, 'id');
console.log(b);
// b:
// { '23': { id: 23, title: 'meat' },
//   '45': { id: 45, title: 'fish' },
//   '71': { id: 71, title: 'fruit' } }

-2
        var obj = [
            {id: 1 , name : 'gaju' , class : 'kv'},
            {id: 2 , name : 'tushar' , class : 'Super'}
        ];

        function conv(obj,arg){
        var temp= {};
        var output= {}
        for(key in obj){
        temp[key] = obj[key];
        };

        var i=0;
        for(key in temp){
        var aa = {};
        var value = temp[key][arg];
        aa[value] = temp[i];
        //console.log(aa[value][arg] );
        output[aa[value][arg]]=  aa[value];
        i++;
        }

       console.log(output); 
        }

calling function 

    conv(obj,'class');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.