Bagaimana cara mengubah array Objek menjadi satu Objek di JavaScript?


109

Saya memiliki array objek:

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

Bagaimana cara mengubahnya menjadi yang berikut dengan 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

Jawaban:


57

Anda mungkin mencari sesuatu seperti ini:

// 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
Lihat jawaban FirstOne untuk pendekatan modern.
Tibos

149

Solusi kecil ES6 dapat terlihat seperti:

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)

Juga, jika Anda menggunakan penyebaran objek, maka akan terlihat seperti:

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

Satu lagi solusi yang 99% lebih cepat adalah (diuji di jsperf):

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

Di sini kita mendapatkan keuntungan dari operator koma, ini mengevaluasi semua ekspresi sebelum koma dan mengembalikan yang terakhir (setelah koma terakhir). Jadi kami tidak menyalin objsetiap kali, melainkan menugaskan properti baru untuk itu.


3
Mencintai yang satu ini! var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
Sohail

apakah satu baris ini lebih cepat atau loop konvensional?
Jeb50

2
@ Jeb50, loop konvensional adalah yang tercepat, tetapi tidak melebihi operator koma. Object.assign / spread operator memiliki urutan magnitudo lebih lambat: jsperf.com/comma-operator-js
Josh Geller

1
Anda lupa menyebarkan objek kedua({...obj, ...{[item.key]: item.value}}) ,{});
Julia

Terima kasih, sebenarnya tidak perlu membungkus ini dalam sebuah objek. Saya telah memperbaikinya.
Shevchenko Viktor

60

Saya suka pendekatan fungsional untuk mencapai tugas ini:

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

Catatan: Terakhir {}adalah nilai awal objuntuk fungsi reduce, jika Anda tidak memberikan nilai awal, arrelemen pertama akan digunakan (yang mungkin tidak diinginkan).

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


2
dan apakah kuncinya dinamis?
Stefano Saitta

1
Nah, Anda harus tahu properti mana dari item / objek tertentu yang harus digunakan sebagai kunci dan yang mana sebagai nilai no? Tetapi jika kita mengasumsikan bahwa wfirst prop selalu merupakan kunci dan kedua nilainya kita dapat menggunakan fungsi callback seperti ini: function (obj, item) {var keys = item.keys (); obj [item [kunci [0]]] = item [kunci [0]]; return obj; }
GreQ

Koreksi callback di atas: code var obj = arr.reduce (fungsi (obj, item) {var keys = Object.keys (item); obj [item [keys [0]]] = item [keys [1]]; return obj;}, {});
GreQ

60

Mencoba untuk memperbaiki jawaban ini di Bagaimana cara mengubah array Objek menjadi satu Objek di JavaScript? ,

ini harus melakukannya:

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 );


Satu baris:

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

21

Menggunakan 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);


13

Cara bersih untuk melakukan ini menggunakan JavaScript modern adalah sebagai berikut:

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" }


6

Berdasarkan jawaban yang disarankan oleh banyak penulis, saya membuat skenario pengujian JsPref. https://jsperf.com/array2object82364

Di bawah ini adalah tangkapan layar kinerja. Sedikit mengejutkan saya melihat, hasil chrome sangat kontras dengan firefox dan edge, bahkan setelah menjalankannya beberapa kali.

Tepi

Firefox

Chrome


2

Menggunakan 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

Pembaruan: Dunia terus berputar. Gunakan pendekatan fungsional sebagai gantinya.

Ini dia:

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"}

Ini secara mengejutkan menyerupai jawaban yang diposting seseorang 5 menit yang lalu
Alexander

1
Karena itulah cara Anda mengatasi masalah ini. Tentang penamaan misalnya: arrayadalah kata kunci yang dipesan sehingga orang menggunakan arrsebagai gantinya. dll.
pstadler

0

Berikut ini cara menerima pernyataan di atas secara dinamis sebagai string dan menginterpolasi menjadi objek:

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)


Meskipun ini mungkin menjawab pertanyaan, lebih baik menambahkan beberapa deskripsi tentang bagaimana jawaban ini dapat membantu menyelesaikan masalah. Silakan baca Bagaimana cara menulis jawaban yang bagus untuk mengetahui lebih banyak.
Roshana Pitigala

0

Anda dapat menggunakan fungsi lodash mapKeys untuk itu. Hanya satu baris kode!

Silakan merujuk ke contoh kode lengkap ini (salin tempel ini ke repl.it atau serupa):

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' } }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.