Javascript 从其他对象填充对象中的字段

Javascript 从其他对象填充对象中的字段,javascript,ecmascript-6,Javascript,Ecmascript 6,在Javascript(ES6)中,有两个包含数据的对象 const template = { a: '', b: '', x: '' } 这是我将接收的数据对象 const data = { a: 'test', b: 'test', c: 'test' } 如何将接收到的对象中的数据映射到模板对象,而不允许模板对象中不存在的值。 所以结果应该是这样 const result = { a: 'test', b: 'test',

在Javascript(ES6)中,有两个包含数据的对象

const template = {
    a: '',
    b: '',
    x: ''
}
这是我将接收的数据对象

const data = {
    a: 'test',
    b: 'test',
    c: 'test'
}
如何将接收到的对象中的数据映射到模板对象,而不允许模板对象中不存在的值。

所以结果应该是这样

const result = {
    a: 'test',
    b: 'test',
    x: ''
}
您可以使用循环:

const模板={
a:“”,
b:'
}
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
const result={};
for(让k进入模板){
结果[k]=数据[k];
}
console.log(result)
类似以下内容:

let result={};
常量模板={
a:“”,
b:'
}
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
for(让道具插入数据){
如果(模板中的属性)结果[prop]=数据[prop];
}

控制台日志(结果)
您可以从
数据
获取
模板
对象和具有相同键的属性

const
模板={a:'',b:'',x:''},
数据={a:'测试',b:'测试',c:'测试'},
结果=Object.assign(
{},
模板,
…Object.keys(template.map)(数据中的k=>k&&{[k]:数据[k]})
);

控制台日志(结果)只是为了好玩,你可以使用一些代理魔法:)

const模板={
a:“”,
b:'
}
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
const result={…新代理(数据{
ownKeys:()=>Object.keys(模板)
})
}

console.log(result)
您可以使用
数组。reduce
查看您的对象,只更改您感兴趣的键。此方法还将处理要从
数据
复制的密钥不在此处的情况。此外,我们还创建了一个新对象,我们不会对现有对象进行变异


无突变(新对象)

const模板={
a:“”,
b:“,
};
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’,
};
const ret=Object.keys(模板).reduce((tmp,x)=>{
tmp[x]=数据[x]!==无效0?数据[x]:tmp[x];
返回tmp;
}, {
…模板,
});
控制台日志(ret)
const模板={
a:“”,
b:'
}
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
功能设置数据(inputTemplate、inputData){
outputObject={}
for(输入模板中的var键){
if(输入数据[键]){
outputObject[key]=inputData[key];
}
}
返回输出对象
}

log(setData(template,data))
您可以简单地循环模板的键,并使用具有相同键的数据对象设置值

const数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
常量模板={
a:“”,
b:'
}
Object.key(模板).forEach((key)=>template[key]=data[key])

console.log(模板)
您也可以使用reduce

例如:

const模板={
a:“”,
b:'
}
常数数据={
a:‘测试’,
b:‘测试’,
c:‘测试’
}
const res=Object.keys(模板).reduce((全部,acc)=>{
全部[acc]=数据[acc]
全部归还
}, {})

console.log(res)
代理对我来说是新的!感谢您的“乐趣”选项,我将检查文档在
模板
中,但在
数据
中的属性发生了什么情况?好问题!它保持不变,让我更改代码以反映