关于一个多数组组合的面试题 js
原始数据
const defaultselectList = [
{
attibutedid: '10001',
attibuteSelected: ['大陆版', '港版']
},
{
attibutedid: '10002',
attibuteSelected: ['红', '白']
},
{
attibutedid: '10003',
attibuteSelected: ['32G', '16G']
}
]
最终效果数据
const result = [
{ "10001": '大陆版', '10002': '红', '10003': '32G' },
{ "10001": '大陆版', '10002': '白', '10003': '32G' },
{ "10001": '大陆版', '10002': '红', '10003': '16G' },
{ "10001": '大陆版', '10002': '白', '10003': '16G' },
{ "10001": '港版', '10002': '红', '10003': '32G' },
{ "10001": '港版', '10002': '白', '10003': '32G' },
{ "10001": '港版', '10002': '红', '10003': '16G' },
{ "10001": '港版', '10002': '白', '10003': '16G' }
]
对比很快能看出:(先从双数组分析,再进行多数组的)
- 对象中attibutedid 是key键,而attibuteSelected内的每个值是相对应的value值;
- 他们每个对象的会根据attibuteSelected,之间存在随机组合的关系;
双数组,使用双重for循环实现数据的所有排列组合 - 每个对象生成的key-value是彼此拼接在一起的
使用结构赋值实现数组对象属性的拼接组合
最后使用reduce 将每次的两两数组进行 拼接组合 生成最终的数据
-------直接上代码--------
function reset(data,key,value) {
//实现对象根据相应的key value 组装成数组
function main(tempData) {
let temp = []
tempData[value].forEach((i, index) => {
temp[index] = {}
temp[index][tempData[key]] = i
})
return temp
}
//实现两个数组直接的随机组合
function getValuesByArray(arr1, arr2) {
var arr = [];
for (var i = 0; i < arr1.length; i++) {
var v1 = arr1[i];
for (var j = 0; j < arr2.length; j++) {
var v2 = arr2[j];
var value = {...v1,...v2}
arr.push(value);
};
};
return arr;
}
//实现数组的累加
let tempdatas= data.reduce(function(a,b,c){
return [...getValuesByArray((a.length?a:main(a)),main(b))]
})
return tempdatas
}
}
//进行调用
console.log((reset(defaultselectList,'attibutedid','attibuteSelected')))
功能大概实现了!!有更好的方式欢迎 @小编 相互讨论