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"
}
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"
}
Câu trả lời:
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);
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ó.
var object = arr.reduce((obj, item) => (obj[item.key] = item.value, obj) ,{});
({...obj, ...{[item.key]: item.value}}) ,{});
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 {}là 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).
Đ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 );
var newObj = Object.assign({}, ...(array.map(item => ({ [item.key]: item.value }) )));
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);
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" }
Sử dụng lodash !
const obj = _.keyBy(arrayOfObjects, 'keyName')
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.
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'));
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"}
arraylà từ khóa dành riêng nên mọi người dùng arrthay thế. vv
Đâ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
// 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)
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' } }
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');
[{key:"11", value:"1100"}, {key:"22", value:"2200"}].reduce(function(m,v){m[v.key] = v.value; return m;}, {})