在Javascript中将数据从一个形状转换为另一个形状

在Javascript中将数据从一个形状转换为另一个形状,javascript,ecmascript-6,Javascript,Ecmascript 6,我将如何使用Javascript转换下面的数据形状(es6很好) 发件人: 致: 第二个形状是第一个形状选项的所有可能组合 我正在尝试构建一个产品表单,该表单可以处理具有变体的产品,例如颜色、尺寸、材质等。每个变体都可以有多个选项。e、 g.对于颜色,它们可以是红色、蓝色、橙色等。要使其发挥作用,我想我需要得到一个列表,生成所有可能的组合,以便我可以为每个组合附加一个价格 在我遇到困难时,非常感谢您的帮助:( 下面是我试过的,但形状不对 let变量=[{ 名称:“颜色”, 选项:[{ 价值:“

我将如何使用Javascript转换下面的数据形状(es6很好)

发件人:

致:

第二个形状是第一个形状选项的所有可能组合

我正在尝试构建一个产品表单,该表单可以处理具有变体的产品,例如颜色、尺寸、材质等。每个变体都可以有多个选项。e、 g.对于颜色,它们可以是红色、蓝色、橙色等。要使其发挥作用,我想我需要得到一个列表,生成所有可能的组合,以便我可以为每个组合附加一个价格

在我遇到困难时,非常感谢您的帮助:(

下面是我试过的,但形状不对

let变量=[{
名称:“颜色”,
选项:[{
价值:“黄金”
}, {
值:“空间灰色”
}]
},
{
名称:“尺寸”,
选项:[{
值:“32”
}, {
值:“64”
}]
},
{
名称:“宽度”,
选项:[{
值:“100”
}, {
值:“200”
}]
}
]
常量[primaryOption,…otherOptions]=变量
让选项=[]
primaryOption.options.map(x=>{
otherOptions.map(y=>{
y、 options.map(z=>{
选项=[
…选项,
{
特性:{
[primaryOption.name]:x.value,
[y.name]:z.value
}
}
]
})
})
})
console.log(选项)
只需使用嵌套循环遍历所有值,并用它们构建一个新数组。

let变量=[{
名称:“颜色”,
选项:[{
价值:“黄金”
}, {
值:“空间灰色”
}]
},
{
名称:“尺寸”,
选项:[{
数值:32
}, {
数值:64
}]
},
{
名称:“宽度”,
选项:[{
数值:100
}, {
价值:200
}]
}
];
让endIndex=variants[0].options.length;
让结果=[];
for(设i=0;i{
结果[i]=结果[i]|{属性:{};
结果[i]。属性[x.name]=x.options[i]。值;
});
}

console.log(result);
您可以通过迭代外部数组获取笛卡尔乘积,并获取内部数组作为附加对象的值

函数getCartesian(数组){ 返回数组.reduce((r,{name,options})=>{ var-temp=[]; r、 forEach(({property})=> options.forEach(({value})=>temp.push({property:Object.assign({},property,{[name]:value}})) ); 返回温度; }, [{}]); } 变量数据=[{name:“Color”,选项:[{value:“Gold”},{value:“Space grey”},{name:“Size”,选项:[{value:32},{value:64}]},{name:“Width”,选项:[{value:100},{value:200}]; console.log(getCartesian(数据));
.as控制台包装{最大高度:100%!重要;顶部:0;}
我认为这个问题根本不适合新手。@Archer,我尝试过各种形式的reduce和map。但没有一种能达到目的。三个嵌套循环可以让你达到目的。@Archer,很公平。我已经添加了我的尝试。我认为这不值得一提,因为它似乎离解决方案很远。我将尝试使用Robby Cornelissen那样的循环建议。不,这表明你至少已经研究了这个问题,并尝试了一些大多数人都想看到的东西。这是一个质量更好的问题,通常会得到更好的答案,这就是堆栈溢出的原因。感谢更新:)这非常有效,谢谢。我真的很感激。@note非常乐意帮忙:)
[
  {
    name: "Color",
    options: [{ value: "Gold" }, { value: "Space grey" }]
  },
  {
   name: "Size",
     options: [{ value: 32 }, { value: 64 }]
  },
  {
    name: "Width",
    options: [{ value: 100 }, { value: 200 }]
  }
]
[
  {
    properties: {
      Color: "Gold",
      Size: 32,
      Width: 100
    }
  },
  {
    properties: {
      Color: "Gold",
      Size: 32,
      Width: 200
    }
  },
  {
    properties: {
      Color: "Gold",
      Size: 64,
      Width: 100
    }
  },
  {
    properties: {
      Color: "Gold",
      Size: 64,
      Width: 200
    }
  },
  {
    properties: {
      Color: "Space grey",
      Size: 32,
      Width: 100
    }
  },
  {
    properties: {
      Color: "Space grey",
      Size: 32,
      Width: 200
    }
  },
  {
    properties: {
      Color: "Space grey",
      Size: 64,
      Width: 100
    }
  },
  {
    properties: {
      Color: "Space grey",
      Size: 64,
      Width: 200
    }
  }
]
 let result = [{}];

 for(const {name, options} of input) {
   const previous = result;
   result = [];
   for(const {value} of options) {
      for(const prev of previous)
         result.push({ ...prev, [name]: value });
   }
}