问题描述
如何在javascript中将嵌套对象更改为新对象。
我有一个对象obj
,如果详细信息是数组,则将第一个数组值作为javascript中的值。
function newObj(obj1) {
let map = {};
obj1.forEach(e => {
let details = e.details;
Object.values(details).forEach(value => {
if (Array.isArray(value) && value.length > 0) {
map[value[0]] = value[0];
}
else if (typeof value === 'object') {
Object.values(value).forEach(val => { map[val] = val; });
}
})
});
return map;
}
var obj1 = [
{
details : {
"info" : ["stocks","finance",""],"sales" : ["analytics"]
}
}
];
var obj2 = [
{
details : {
"city" : "SG"
}
}
];
var r1 = this.newObj(obj1);
var r2 = this.newObj(obj2);
预期产量
//for obj1 (show only first value of array)
{
info : "stocks",sales : "analytics"
}
//obj2
{
city : "SG"
}
解决方法
我认为您过于复杂了。看下面的例子。逻辑是这样的:
- 遍历
details
键 - 如果 key 下的 value 是一个数组,则在
key
中创建map
并分配value[0]
- 如果 key 下的 value 不是数组,则只需将其值复制到
map
这足以实现您想要的。
function newObj(obj){
let map = {};
obj.forEach(e => {
let details = e.details;
Object.keys(details).forEach(key => {
var value = details[key];
if (Array.isArray(value) && value.length > 0){
map[key] = value[0];
} else {
map[key] = value;
}
});
});
return map;
}
var obj1 = [
{
details: {
"info":["stocks","finance",""],"sales":["analytics"]
}
}
];
var obj2 = [
{
details: {
"city":"SG"
}
}
];
var r1 = newObj(obj1);
var r2 = newObj(obj2);
console.log(r1);
console.log(r2);
,
这是一个非常简洁的解决方案,这要归功于解构任务:
function newObj(obj) {
const [{ details }] = obj;
const entries = Object.entries(details)
.map(([key,value]) => ([key,Array.isArray(value) ? value[0] : value]));
return Object.fromEntries(entries);
}
实时示例:
'use strict';
function newObj(obj) {
const [{ details }] = obj;
const entries = Object.entries(details)
.map(([key,Array.isArray(value) ? value[0] : value]));
return Object.fromEntries(entries);
}
const obj1 = [
{
details: {
info: ['stocks','finance',''],sales: ['analytics']
}
}
];
const obj2 = [
{
details: {
city: 'SG'
}
}
];
console.log(newObj(obj1));
console.log(newObj(obj2));