这个数据格式
let skuAttrList = [{
"attrName": "颜色",
"attrValList": [{
"skuValId": "123",
"skuVal": "红色"
}, {
"skuValId": "456",
"skuVal": "黑色"
}]
}, {
"attrName": "尺寸",
"attrValList": [{
"skuValId": "789",
"skuVal": "200ml"
}, {
"skuValId": "1011",
"skuVal": "500ml"
}]
}];
我现在转换为
s1 等于颜色的id,因为尺寸有多个,所以一个s1两个s2
let newList = [
{"s1":"123","s2":"789"},//s1颜色第一个id s2尺寸第一个id
{"s1":"123","s2":"1011"},//s1颜色第一个id s2尺寸第二个id
{"s1":"456","s2":"789"},//s1颜色第二个id s2尺寸id
{"s1":"456","s2":"1011"}//s1颜色第二个id s2尺寸id
]
skuAttrList是动态的可能会多个,如果skuAttrList数组是
let skuAttrList = [
{
"attrName": "颜色",
"attrValList": [{
"skuValId": "123",
"skuVal": "红色"
}, {
"skuValId": "456",
"skuVal": "黑色"
}]
},
{
"attrName": "尺寸",
"attrValList": [{
"skuValId": "789",
"skuVal": "200ml"
}, {
"skuValId": "1011",
"skuVal": "500ml"
}]
},
{
"attrName": "外观",
"attrValList": [{
"skuValId": "789",
"skuVal": "奢华"
}, {
"skuValId": "1011",
"skuVal": "中等"
},
{
"skuValId": "1011",
"skuVal": "普通"
}
]
},
];
那么对应的就要加上 s3 这个属性
###多数组的组合。强撸:
function getPath(skuAttrList) {
var result = null;
for(let i = skuAttrList.length - 1; i >= 0; --i) {
const { attrValList } = skuAttrList[i];
const currentNodePathList = attrValList.reduce((currentNodePathList, attrVal) => {
const { skuValId } = attrVal
currentNodePathList.push({ [`s${i + 1}`]: skuValId});
return currentNodePathList;
}, []);
if(!result) {
result = currentNodePathList;
} else {
const tempResult = [];
currentNodePathList.forEach(path => {
result.forEach(preNodePath => {
tempResult.push({ ...path, ...preNodePath});
})
});
result = tempResult;
}
}
return result
}
// TEST
getPath(skuAttrList);
###试着用函数式来实现一下
const { curry, compose } = require('ramda');
// 生成[[{s1:xx},{s1:xx}], [{s2:xx},{s2:xx}]] 数组
const getObj = curry((prefix, prop, propId, list) => {
let index = 0;
return list.map((value) => {
index += 1;
const fullProp = prefix + index;
return Array.isArray(value[prop])
? value[prop].map((v) => ({ [fullProp]: v[propId] }))
: [];
});
});
// 用累加器实现
const getList = (list) => {
const res = list.reduce((total, item) => total.map((_) => item.map((v) => ({ ..._, ...v })))
.flat());
return res;
};
const getData = compose(getList, getObj('s', 'attrValList', 'skuValId'));
const skuAttrList = [
{
attrName: '颜色',
attrValList: [
{
skuValId: '123',
skuVal: '红色',
},
{
skuValId: '456',
skuVal: '黑色',
},
],
},
{
attrName: '尺寸',
attrValList: [
{
skuValId: '789',
skuVal: '200ml',
},
{
skuValId: '1011',
skuVal: '500ml',
},
],
},
];
console.log(getData(skuAttrList));
const skuAttrList2 = [
{
attrName: '颜色',
attrValList: [{
skuValId: '123',
skuVal: '红色',
}, {
skuValId: '456',
skuVal: '黑色',
}],
},
{
attrName: '尺寸',
attrValList: [{
skuValId: '789',
skuVal: '200ml',
}, {
skuValId: '1011',
skuVal: '500ml',
}],
},
{
attrName: '外观',
attrValList: [{
skuValId: '789',
skuVal: '奢华',
}, {
skuValId: '1011',
skuVal: '中等',
},
{
skuValId: '1012',
skuVal: '普通',
},
],
},
];
console.log(getData(skuAttrList2));