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"
}
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"
}
Jawaban:
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);
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.
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
({...obj, ...{[item.key]: item.value}}) ,{});
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).
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 );
var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));
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);
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" }
Gunakan lodash !
const obj = _.keyBy(arrayOfObjects, 'keyName')
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.
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'));
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"}
arrayadalah kata kunci yang dipesan sehingga orang menggunakan arrsebagai gantinya. dll.
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
// 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)
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' } }
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})