将数组值映射到对象键值
Map array values onto object key values
我有一个这样的对象:
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'subProp1_value',
subProp2: 'subProp2_value',
subProp3: 'subProp3_value',
subprop4: 'subProp4_value',
},
};
和这样的数组:
myArr = [
'arrayVal_1',
'arrayVal_2',
'arrayVal_3',
'arrayVal_4',
];
对于上下文,subObj 和 myArr 始终具有相同的长度。
我想做的是将 myArr 中的每个值映射到 subObj 的值。
myObj 完成后看起来像这样:
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'arrayVal_1',
subProp2: 'arrayVal_2',
subProp3: 'arrayVal_3',
subprop4: 'arrayVal_4',
},
};
我可以手动分别为每个键分配值,但这看起来很草率。我试过在 myObj 上使用 Object.keys、Object.entries 和 Object.values 循环,但似乎无法通过这个进行推理。谢谢
你可以用 Object.fromEntries
and Object.keys
这样做:
myObj.subObj = Object.fromEntries(Object.keys(myObj.subObj).map((k,i) => [k, myArr[i]]))
请注意,目前没有任何类型的 safe-guards,因此您可能需要在执行此操作之前检查这两个数据结构是否合适。
如果您有可以按对象键排序的东西,您也可以使用 sort
来确保将正确的值分配给正确的键,因为 Object.keys
的结果顺序是不保证
myObj.subObj = Object.fromEntries(Object.keys(myObj.subObj)
.sort((a,b) => a.localeCompare(b)) //sort keys ascending by name
.map((k,i) => [k, myArr[i]]))
使用Object#keys
and Array#forEach
:
const
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: { subProp1: 'subProp1_value', subProp2: 'subProp2_value', subProp3: 'subProp3_value', subprop4: 'subProp4_value' }
},
myArr = [ 'arrayVal_1', 'arrayVal_2', 'arrayVal_3', 'arrayVal_4' ];
const { subObj } = myObj;
Object.keys(subObj).forEach((prop, index) => { subObj[prop] = myArr[index] });
console.log(myObj);
您想将键和数组循环在一起。一种方法是这样尝试:
const myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'subProp1_value',
subProp2: 'subProp2_value',
subProp3: 'subProp3_value',
subprop4: 'subProp4_value',
},
};
const myArr = ['arrayVal_1', 'arrayVal_2', 'arrayVal_3', 'arrayVal_4'];
const keys = Object.keys(myObj.subObj); // You should actually sort these according to myArr to ensure safety
for (let i = 0; i < myArr.length; i++) {
myObj.subObj[keys[i]] = myArr[i];
}
console.log(myObj);
我有一个这样的对象:
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'subProp1_value',
subProp2: 'subProp2_value',
subProp3: 'subProp3_value',
subprop4: 'subProp4_value',
},
};
和这样的数组:
myArr = [
'arrayVal_1',
'arrayVal_2',
'arrayVal_3',
'arrayVal_4',
];
对于上下文,subObj 和 myArr 始终具有相同的长度。
我想做的是将 myArr 中的每个值映射到 subObj 的值。
myObj 完成后看起来像这样:
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'arrayVal_1',
subProp2: 'arrayVal_2',
subProp3: 'arrayVal_3',
subprop4: 'arrayVal_4',
},
};
我可以手动分别为每个键分配值,但这看起来很草率。我试过在 myObj 上使用 Object.keys、Object.entries 和 Object.values 循环,但似乎无法通过这个进行推理。谢谢
你可以用 Object.fromEntries
and Object.keys
这样做:
myObj.subObj = Object.fromEntries(Object.keys(myObj.subObj).map((k,i) => [k, myArr[i]]))
请注意,目前没有任何类型的 safe-guards,因此您可能需要在执行此操作之前检查这两个数据结构是否合适。
如果您有可以按对象键排序的东西,您也可以使用 sort
来确保将正确的值分配给正确的键,因为 Object.keys
的结果顺序是不保证
myObj.subObj = Object.fromEntries(Object.keys(myObj.subObj)
.sort((a,b) => a.localeCompare(b)) //sort keys ascending by name
.map((k,i) => [k, myArr[i]]))
使用Object#keys
and Array#forEach
:
const
myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: { subProp1: 'subProp1_value', subProp2: 'subProp2_value', subProp3: 'subProp3_value', subprop4: 'subProp4_value' }
},
myArr = [ 'arrayVal_1', 'arrayVal_2', 'arrayVal_3', 'arrayVal_4' ];
const { subObj } = myObj;
Object.keys(subObj).forEach((prop, index) => { subObj[prop] = myArr[index] });
console.log(myObj);
您想将键和数组循环在一起。一种方法是这样尝试:
const myObj = {
prop1: 'prop1_value',
prop2: 'prop2_value',
subObj: {
subProp1: 'subProp1_value',
subProp2: 'subProp2_value',
subProp3: 'subProp3_value',
subprop4: 'subProp4_value',
},
};
const myArr = ['arrayVal_1', 'arrayVal_2', 'arrayVal_3', 'arrayVal_4'];
const keys = Object.keys(myObj.subObj); // You should actually sort these according to myArr to ensure safety
for (let i = 0; i < myArr.length; i++) {
myObj.subObj[keys[i]] = myArr[i];
}
console.log(myObj);