使用JavaScript动态创建条件对象
我正在尝试根据另一个对象的内容创建一个对象。我有一个包含以下键/值的对象:使用JavaScript动态创建条件对象,javascript,object,Javascript,Object,我正在尝试根据另一个对象的内容创建一个对象。我有一个包含以下键/值的对象: var inputObject = { "color": [ "black", "red", "green" ], "bottom": [ "A", "B", "C", "D", ], "top": [ "L", "M" ]
var inputObject = {
"color": [
"black",
"red",
"green"
],
"bottom": [
"A",
"B",
"C",
"D",
],
"top": [
"L",
"M"
]
}
我想修改此对象,使其创建动态数量的关键点。以下是我的预期输出:
var outputObject = {
"blackBottom": [
"A",
"B",
"C",
"D",
],
"redBottom": [
"A",
"B",
"C",
"D",
],
"greenBottom": [
"A",
"B",
"C",
"D",
],
"blackTop": [
"L",
"M"
],
"redTop": [
"L",
"M"
],
"greenTop": [
"L",
"M"
]
}
符合下列条件的:
- 如果
键内没有颜色,或者“color”
键不存在,则创建所有4个“color”
“color”+“Bottom”和“Top”
- 如果
对象中只有一种颜色,则只创建该“color”
“color”+“Bottom”和“Top”
- 如果
中没有条目,则只创建“底部”
“颜色”+“底部”
如何创建
outputObject
?您可以动态地向outputObject
添加信息,如下所示:
var outputObject = {
// unconditional things
exampleUnconditional: [
"someValue"
]
};
if(inputObject. /* your condition here */) {
outputObject.exampleConditional = [
"someContent"
]
};
因此,outputObject
的结果如下:
{
exampleUnconditional: [
"someValue"
],
exampleConditional: [
"someContent"
]
}
您可以动态地将信息添加到
outputObject
中,如下所示:
var outputObject = {
// unconditional things
exampleUnconditional: [
"someValue"
]
};
if(inputObject. /* your condition here */) {
outputObject.exampleConditional = [
"someContent"
]
};
因此,outputObject
的结果如下:
{
exampleUnconditional: [
"someValue"
],
exampleConditional: [
"someContent"
]
}
使用
reduce
//ES6版本,具有要求的灵活性
const generate=({color:colors,bottom,top})=>
颜色。减少(
(acc,颜色)=>对象分配(acc,
底部&{[`{color}bottom`]:[…bottom]},
顶部&{[`{color}top`]:[…顶部]}
),
{})
//ES5版本
函数generatedgoodes5(输入){
//从输入中提取值,不进行分解
var colors=input.color,
bottom=input.bottom,
top=input.top;
返回颜色。减少(函数(输出,颜色){
//分配相应的属性
out[color+'Bottom']=Bottom.slice();//复制数组
out[color+'Top']=Top.slice();//复制数组
返回
}, {});
}
变量inputObject={
“颜色”:[
“黑色”,
“红色”,
“绿色”
],
“底部”:[
“A”,
“B”,
“C”,
“D”,
],
“顶部”:[
“L”,
“M”
]
}
console.log(“ES6输出”)
console.log(生成(inputObject))
控制台日志(“ES5输出”)
log(generateOldGoodES5(inputObject))
迭代每种颜色,并使用reduce
//ES6版本,具有要求的灵活性
const generate=({color:colors,bottom,top})=>
颜色。减少(
(acc,颜色)=>对象分配(acc,
底部&{[`{color}bottom`]:[…bottom]},
顶部&{[`{color}top`]:[…顶部]}
),
{})
//ES5版本
函数generatedgoodes5(输入){
//从输入中提取值,不进行分解
var colors=input.color,
bottom=input.bottom,
top=input.top;
返回颜色。减少(函数(输出,颜色){
//分配相应的属性
out[color+'Bottom']=Bottom.slice();//复制数组
out[color+'Top']=Top.slice();//复制数组
返回
}, {});
}
变量inputObject={
“颜色”:[
“黑色”,
“红色”,
“绿色”
],
“底部”:[
“A”,
“B”,
“C”,
“D”,
],
“顶部”:[
“L”,
“M”
]
}
console.log(“ES6输出”)
console.log(生成(inputObject))
控制台日志(“ES5输出”)
log(generateOldGoodES5(inputObject))
您尝试了什么?你的问题在哪里。提醒一下,这里的人真的不喜欢你做家庭作业……你试过什么?你的问题在哪里。只是提醒一下,这里的人真的不喜欢做你的家庭作业……ES6使用得很好!然而,我不认为OP会不加解释就理解…@Jonasw ES5版本添加了一些注释。我喜欢ES6版本,但是它只在所有“color”
、“top”
、和“bottom”
都存在时才起作用。当“top”
或“bottom”
都不存在时,有没有办法使解决方案起作用?@black\u sheep07在func参数中,可以使用bottom=[],top=[]使其工作。@black\u sheep07可以像Object.assign(acc,top&&{[/code>${color}top]:[…top]},bottom&&/*此处相同*/}
ES6的使用很好!但是,我认为OP在没有解释的情况下不会理解…@Jonasw ES5版本添加了一些注释。我喜欢ES6版本,但是它只在所有“color”
、“top”
和“bottom”的情况下工作
存在。当“top”
或“bottom”
不存在时,解决方案有没有办法工作?@black\u sheep07在func参数中,可以使用bottom=[],top=[]使其工作。@black\u sheep07您可以像这样做对象。分配(acc,top&&{color}top]:[…top]},底部&&/*此处相同*/}