代码其实还可以优化,但项目赶,先放在这
let ss = gg2(arr2, arr2, true ,{key: 'bool',
thenBy: {key: 'value', beforeKeys: ['bool'],
thenBy: {key: 'unit', beforeKeys: ['bool', 'value'],
thenBy: {key: 'valueset', beforeKeys: ['bool', 'value', 'unit']}}
}});
console.log(ss)
结果如下:
const arr2 = [
{id: '1', bool: true, value: '38.5', unit: 'mg', valueset: null, index: 1},
{id: '1', bool: true, value: '38.5', unit: 'mg', valueset: null, index: 2},
{id: '1', bool: true, value: '38.5', unit: 'kg', valueset: null, index: 3},
{id: '1', bool: true, value: '36.5', unit: 'mg', valueset: null, index: 4},
{id: '1', bool: true, value: '36.5', unit: 'kg', valueset: null, index: 5},
{id: '1', bool: true, value: '36.5', unit: 'kg', valueset: null, index: 6},
{id: '1', bool: false, value: '38.5', unit: 'mg', valueset: 'null1', index: 7},
{id: '1', bool: false, value: '38.5', unit: 'kg', valueset: null, index: 8},
{id: '1', bool: false, value: '36.5', unit: 'mg', valueset: null, index: 9},
{id: '1', bool: false, value: '36.5', unit: 'kg', valueset: null, index: 10},
{id: '1', bool: null, value: '37.5', unit: 'mg', valueset: null, index: 11},
{id: '1', bool: null, value: '35.5', unit: 'kg', valueset: 'null1', index: 12},
{id: '1', bool: null, value: '37.5', unit: 'mg', valueset: null, index: 13},
{id: '1', bool: true, value: '38.5', unit: 'mg', valueset: 'null1', index: 14},
]
function gg2(reduceList, arrays, isFirst ,pan) {
let tempp = {};
let list = [];
let a = [];
const key = pan.key;
const beforeKeys = pan.beforeKeys;
if (isFirst) {
a= reduceList.reduce((prev, curv) => {
if (tempp[curv[key]]) {
}else {
tempp[curv[key]] = true;
prev.push(curv);
}
return prev
}, []);
a.forEach((item) => {
const b = arrays.filter((data) => data[key] === item[key]);
list.push(b);
})
} else {
reduceList.forEach((item) => {
tempp = {};
a.push(item.reduce((prev, curv) => {
if (tempp[curv[key]]) {
}else {
tempp[curv[key]] = true;
prev.push(curv);
}
return prev
}, []));
})
let c = 'data[key] === item2[key]';
beforeKeys.forEach((item) => {
c = `${c} && data['${item}'] === item2['${item}']`
})
a.forEach((item) => {
item.forEach((item2) => {
list.push(arrays.filter((data) => eval(c)));
})
})
}
if (pan.thenBy) {
return gg2(list, arrays, false, pan.thenBy)
} else {
return list
}
}