使用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”
    键内没有颜色,或者
    “color”
    键不存在,则创建所有4个
    “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]},底部&&/*此处相同*/}