我正在处理一个反应本机应用程序说我有这些数组列表:
let soldList1 = [
{"itemCode":"X001" , "soldRate":0.0789},
{"itemCode":"5555" , "soldRate":0.0543},
{"itemCode":"3141" , "soldRate":0.0112},
{"itemCode":"Mix-001" , "soldRate":0.01},
{"itemCode":"7689-L" , "soldRate":0.005},
{"itemCode":"1111" , "soldRate":0.003}
]
let soldList2 = [
{"itemCode":"3141" , "soldRate":0.0712},
{"itemCode":"7689-L" , "soldRate":0.03},
{"itemCode":"5555" , "soldRate":0.0234},
{"itemCode":"1111" , "soldRate":0.011},
{"itemCode":"X001" , "soldRate":0.008},
{"itemCode":"Mix-001" , "soldRate":0.004}
]
let soldList3 = [
{"itemCode":"5555" , "soldRate":0.0339},
{"itemCode":"X001" , "soldRate":0.0221},
{"itemCode":"3141" , "soldRate":0.0111},
{"itemCode":"1111" , "soldRate":0.0089},
{"itemCode":"Mix-001" , "soldRate":0.0077},
{"itemCode":"7689-L" , "soldRate":0.0032}
]
let soldList4 =[
{"itemCode":"8888" , "soldRate":0.13},
{"itemCode":"9999" , "soldRate":0.11},
{"itemCode":"3141" , "soldRate":0.08},
{"itemCode":"1111" , "soldRate":0.07}
]
let soldList5 =[
{"itemCode":"3141" , "soldRate":0.044},
{"itemCode":"1111" , "soldRate":0.011},
{"itemCode":"8888" , "soldRate":0.0011},
{"itemCode":"9999" , "soldRate":0.0001}
]
let soldList6 =[
{"itemCode":"Mix-001" , "soldRate":0.5678},
{"itemCode":"7689-L" , "soldRate":0.546}
{"itemCode":"8888" , "soldRate":0.323},
{"itemCode":"9999" , "soldRate":0.0032},
{"itemCode":"Mix-001" , "soldRate":0.0022},
{"itemCode":"UV-007" , "soldRate":0.0012}
{"itemCode":"TT-08" , "soldRate":0.0011},
{"itemCode":"PP-03" , "soldRate":0.0009}
]
您可以看到,某些列表获得了其他列表没有的元素,每个列表项目顺序为 desc order by 'soldRate'
,每个列表也可能不同。
因此,目标是阐明这些数组列表和处理以构建新数组列表,类似于以下内容:
let finalAllConcateAndSortedByDataSumList = [
{"itemCode":"Mix-001" , "data": [0.01, 0.004, 0.0077, 0, 0, 0.5678], "dataSum":0.5895},
{"itemCode":"7689-L" , "data": [0.005, 0.03, 0.0032, 0, 0, 0.546], "dataSum":0.5842},
{"itemCode":"8888" , "data": [0, 0, 0, 0.13, 0.0011, 0.323], "dataSum":0.4541},
{"itemCode":"3141" , "data": [0.0112, 0.0712, 0.0111, 0.08, 0.044, 0], "dataSum":0.2175},
{"itemCode":"X001" , "data": [0.0789, 0.008, 0.0221, 0, 0, 0.0221], "dataSum":0.1311},
{"itemCode":"9999" , "data": [0, 0, 0, 0.11, 0.0001, 0.0032], "dataSum":0.1133},
{"itemCode":"5555" , "data": [0.0543, 0.0234, 0.0339, 0, 0, 0], "dataSum":0.1116},
{"itemCode":"1111" , "data": [0.003, 0.011, 0.0089, 0.07, 0.011, 0], "dataSum":0.1039},
{"itemCode":"UV-007" , "data": [0, 0, 0, 0, 0, 0.0012], "dataSum":0.0012},
{"itemCode":"TT-08" , "data": [0, 0, 0, 0, 0, 0.0011], "dataSum":0.0011},
{"itemCode":"PP-03" , "data": [0, 0, 0, 0, 0, 0.0009], "dataSum":0.0009},
]
您可以看到,上面的所有'soldRate'
元素1 2 3 4 5 6已被判断并生成新的数组列表 'data'
属性,每个数据顺序的位置与上述原始列表1 2 23 4 5 6 ....如果在任何原始列表中都不存在元素值,则它是'0'值
最终在FinalAllConcateAndSortedByDataSumList中的每个对象,数据阵列将汇总到属性'dataSum'
然后新列表finalallconcateandsortedbydatasumlist是 desc order by dataSum
这是我个人试图使它起作用的尝试,但它行不通...
let finalAllConcateAndSortedByDataSumList = soldList1.concat(soldList2)
.concat(soldList3)
.concat(soldList4)
.concat(soldList5)
.concat(soldList16).map((item) => {
let newItem = { itemCode: item.itemCode, data: [item.soldRate], dataSum: Math.sum([item.soldRate])}
return newItem
}).sort((item) => { return item.dataSum})
因此在这里寻求帮助,代码示例真的很有帮助谢谢
您可以首先提取阵列中的所有唯一itemCode
值,然后在它们上循环,然后将soldRate
或0
添加到结果中,如果每个数组中存在itemCode
。
let soldList1 = [
{ itemCode: "X001", soldRate: 0.0789 },
{ itemCode: "5555", soldRate: 0.0543 },
{ itemCode: "3141", soldRate: 0.0112 },
{ itemCode: "Mix-001", soldRate: 0.01 },
{ itemCode: "7689-L", soldRate: 0.005 },
{ itemCode: "1111", soldRate: 0.003 }
];
let soldList2 = [
{ itemCode: "3141", soldRate: 0.0712 },
{ itemCode: "7689-L", soldRate: 0.03 },
{ itemCode: "5555", soldRate: 0.0234 },
{ itemCode: "1111", soldRate: 0.011 },
{ itemCode: "X001", soldRate: 0.008 },
{ itemCode: "Mix-001", soldRate: 0.004 }
];
let soldList3 = [
{ itemCode: "5555", soldRate: 0.0339 },
{ itemCode: "X001", soldRate: 0.0221 },
{ itemCode: "3141", soldRate: 0.0111 },
{ itemCode: "1111", soldRate: 0.0089 },
{ itemCode: "Mix-001", soldRate: 0.0077 },
{ itemCode: "7689-L", soldRate: 0.0032 }
];
let soldList4 = [
{ itemCode: "8888", soldRate: 0.13 },
{ itemCode: "9999", soldRate: 0.11 },
{ itemCode: "3141", soldRate: 0.08 },
{ itemCode: "1111", soldRate: 0.07 }
];
let soldList5 = [
{ itemCode: "3141", soldRate: 0.044 },
{ itemCode: "1111", soldRate: 0.011 },
{ itemCode: "8888", soldRate: 0.0011 },
{ itemCode: "9999", soldRate: 0.0001 }
];
let soldList6 = [
{ itemCode: "Mix-001", soldRate: 0.5678 },
{ itemCode: "7689-L", soldRate: 0.546 },
{ itemCode: "8888", soldRate: 0.323 },
{ itemCode: "9999", soldRate: 0.0032 },
{ itemCode: "Mix-001", soldRate: 0.0022 },
{ itemCode: "UV-007", soldRate: 0.0012 },
{ itemCode: "TT-08", soldRate: 0.0011 },
{ itemCode: "PP-03", soldRate: 0.0009 }
];
function sumSoldRates(...arrs) {
let itemCodes = [].concat(...arrs).reduce((acc, obj) => {
if (!acc.includes(obj.itemCode)) {
acc.push(obj.itemCode);
}
return acc;
}, []);
let result = itemCodes.map(code => {
let obj = { itemCode: code, data: [], dataSum: 0 };
arrs.forEach(arr => {
let item = arr.find(el => el.itemCode === code);
if (item) {
obj.data.push(item.soldRate);
obj.dataSum += item.soldRate;
} else {
obj.data.push(0);
}
});
return obj;
});
result.sort((a, b) => b.dataSum - a.dataSum);
return result;
}
let result = sumSoldRates(
soldList1,
soldList2,
soldList3,
soldList4,
soldList5,
soldList6
);
console.log(result);
我将您的过程分为各个步骤,因为它可以清楚您在做什么(更易于调试)。该代码可能不像其他答案那样紧凑或"优雅",但我相信这样更容易理解。
这是一个代码沙盒,显示了此操作(请参阅控制台输出)。
const getItemCodes = (list) => {
return list.map(item => item.itemCode)
}
const getDataValue = (list, itemCode) => {
let index = list.findIndex(item => item.itemCode === itemCode)
return (index === -1 ? 0 : list[index].soldRate)
}
const sumArray = (array) => {
const sum = array.reduce((prev, curr) => {
return (parseFloat(prev) + parseFloat(curr))
})
return sum.toFixed(4)
}
const sortByDataSum = (array) => {
array.sort((a, b) => {
if (a.dataSum > b.dataSum) {
return -1
} else if (a.dataSum < b.dataSum) {
return 1
} else {
return 0
}
})
return array
}
// concat all item codes together, which will result in duplicates
let allItemCodes = [...getItemCodes(soldList1),
...getItemCodes(soldList2),
...getItemCodes(soldList3),
...getItemCodes(soldList4),
...getItemCodes(soldList5),
...getItemCodes(soldList6)]
// remove duplicate codes
allItemCodes = [...new Set(allItemCodes)]
let finalList = []
allItemCodes.forEach((code) => {
let item = {
'itemCode': code,
'data': [getDataValue(soldList1, code),
getDataValue(soldList2, code),
getDataValue(soldList3, code),
getDataValue(soldList4, code),
getDataValue(soldList5, code),
getDataValue(soldList6, code)]
}
item.dataSum = sumArray(item.data)
finalList.push(item)
})
sortByDataSum(finalList)
console.log(finalList)
我将在dicts中使用数组的组合:
let result = {}
soldList1.concat(soldList2)
.concat(soldList3)
.concat(soldList4)
.concat(soldList5)
.concat(soldList6)
.forEach(item => {
if(result[item.itemCode]) {
result[item.itemCode].data.push(item.soldRate);
result[item.itemCode].dataSum += item.soldRate;
} else {
result[item.itemCode] = {data: [item.soldRate], itemCode: item.itemCode, dataSum: item.soldRate};
}
});
let finalAllConcateAndSortedByDataSumList = Object.values(result).sort((item) => { return item.dataSum})
console.log(finalAllConcateAndSortedByDataSumList);