当使用如下对象时,基于当前对象的键构建新对象的最有效方法是什么?键用作对其在新对象中的位置的引用-activityName1
等于新name
嵌套数组的第一个元素activities
,activityName2
等于到数组的第二个元素name
等。
const obj = {
activityName1: "Bingo",
activityName2: "Bazinga",
activityType1: "Dog",
activityType2: "Term",
description: "Games are fun.",
name: "Patty"
};
所需对象:
const newObj = {
activities: [
{name: "Bingo", type: "Dog"},
{name: "Bazinga", type: "Term"}
],
description: "Games are fun.",
name: "Patty"
};
我最初的想法是使用reduce
和Object.assign
,但是构建新对象仅返回一个键/值对:
Object.keys(variables).reduce((obj, key) => {
if (key.includes('activity')) {
return Object.assign(obj, {
[key[key.length - 1]]: { activities: { [key]: variables[key] } } });
}
return obj;
}, {});
产生一个新的activities
数组,例如:
[
1: {activities: {type: "Dog"},
2: {activities: {type: "Term"}
]
答案 0 :(得分:2)
映射的唯一用途是查找以activityName
开头的键,并使用它们来构建activities
的数组。您可以重用将activityName
替换为activityType
的键来获取关联的类型。
const obj = {
activityName1: "Bingo",
activityName2: "Bazinga",
activityType1: "Dog",
activityType2: "Term",
description: "Games are fun.",
name: "Patty"
};
var result = {
activities: Object.keys(obj).filter(k => k.startsWith("activityName")).map(k => ({
name: obj[k],
type:obj[k.replace("activityName","activityType")]
})),
description: obj.description,
name: obj.name
}
console.log(result);