javascript - 根据对象属性将多个数组组合为一个
问题描述
我正在做一个电子商务网站。我必须管理产品变化。REST API 响应如下所示:
"variations": [
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "GRIS"
},
{
"name": "Talle",
"valueName": "L"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "GRIS"
},
{
"name": "Talle",
"valueName": "XXL"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "Azul"
},
{
"name": "Talle",
"valueName": "M"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "GRIS"
},
{
"name": "Talle",
"valueName": "S"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "GRIS"
},
{
"name": "Talle",
"valueName": "XL"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "Azul"
},
{
"name": "Talle",
"valueName": "S"
}
]
},
{
"attributeCombinations": [
{
"name": "Color",
"valueName": "GRIS"
},
{
"name": "Talle",
"valueName": "M"
}
]
}
]
这个 JSON 对我在前端工作来说效率很低。很难根据其类型(名称)和值(值名称)对变体进行分组,因为它们位于不同的“数组数组”上。
最终结果应该是这样的:
variations: [
{
name: 'Color',
values: ['Gris', 'Azul']
},
{
name: 'Talle',
values: ['S', 'M', 'L', 'XL', 'XXL']
}
]
到目前为止,我已经取得了这个结果:
[
{ name: "Color", values: ["GRIS"] },
{ name: "Talle", values: ["L"] },
{ name: "Color", values: ["GRIS"] },
{ name: "Talle", values: ["XXL"] },
{ name: "Color", values: ["Azul"] },
{ name: "Talle", values: ["M"] },
{ name: "Color", values: ["GRIS"] },
{ name: "Talle", values: ["S"] },
{ name: "Color", values: ["GRIS"] },
{ name: "Talle", values: ["XL"] },
{ name: "Color", values: ["Azul"] },
{ name: "Talle", values: ["S"] },
{ name: "Color", values: ["GRIS"] },
{ name: "Talle", values: ["M"] }
]
基于此代码:
let variations = this.$page.product.variations;
let newArr = [];
variations.forEach(variation => {
newArr.push(
Object.values(
variation.attributeCombinations.reduce(
(result, { name, valueName }) => {
// Create new group
if (!result[name]) {
result[name] = {
name,
values: []
};
}
// Append to group
result[name].values.push(valueName);
return result;
},
{}
)
)
);
});
return newArr.reduce((acc, cur) => acc.concat(cur));
解决方案
您可以使用reduce
循环遍历数组并汇总到一个对象中。用于forEach
循环attributeCombinations
并构造所需的输出。用于Object.values
将对象转换为数组。
var variations = [{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"L"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"XXL"}]},{"attributeCombinations":[{"name":"Color","valueName":"Azul"},{"name":"Talle","valueName":"M"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"S"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"XL"}]},{"attributeCombinations":[{"name":"Color","valueName":"Azul"},{"name":"Talle","valueName":"S"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"M"}]}];
var result = Object.values(variations.reduce((c, v) => {
v.attributeCombinations.forEach(({name,valueName}) => {
c[name] = c[name] || {name,values: []}
c[name].values.push(valueName);
});
return c;
}, {}));
console.log(result);
如果您想要唯一值,您可以使用Set
并添加另一个循环将Set
对象转换为数组。
var variations = [{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"L"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"XXL"}]},{"attributeCombinations":[{"name":"Color","valueName":"Azul"},{"name":"Talle","valueName":"M"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"S"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"XL"}]},{"attributeCombinations":[{"name":"Color","valueName":"Azul"},{"name":"Talle","valueName":"S"}]},{"attributeCombinations":[{"name":"Color","valueName":"GRIS"},{"name":"Talle","valueName":"M"}]}]
var result = Object.values(variations.reduce((c, v) => {
v.attributeCombinations.forEach(({name,valueName}) => {
c[name] = c[name] || {name,values: new Set}
c[name].values.add(valueName);
});
return c;
}, {})).map(o => {
o.values = [...o.values.values()]
return o;
});
console.log(result);
推荐阅读
- python-3.x - 在字典中连接多个 Numpy 数组
- python - pandas - 合并和总结几乎重复的行
- identityserver4 - Identityserver 4 自省在注销后将令牌状态显示为活动
- python - 将屏幕像素坐标转换为 PTZ 摄像机平移和倾斜角度 (Pelco-D)
- javascript - 为什么我不在 fullpage.js 中的 setAllowScrolling=false 之后在导航栏中使用 Scroll?
- c# - 将 Grid 放到列表框 WPF 的第一项
- java - Maven 使用 org.apache.cxf:cxf-java2ws-plugin:3.3.0:java2ws 构建:参数列表太长
- r - 是否有任何 R 函数来替换列中因子的“部分”?
- angularjs - 引导更改后AngularJs升级未知提供者
- laravel - Livewire:在连线后将自定义对象保留在 Livewire 组件中:单击?