代码之家  ›  专栏  ›  技术社区  ›  sefirosu

反应JS concate数组,转换成新的二维数组,按二维数组数据和排序

  •  1
  • sefirosu  · 技术社区  · 5 年前

    我正在开发一个react本地应用程序 假设我有这些数组列表:

    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'

    最后,在finallConcateAndSortedByDatasumList中的每个对象,数据数组都将被汇总为属性 'dataSum'

    那么新列表最终ConcateAndSortedByDatasumList是 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})
    

    所以在这里寻求帮助,代码示例将非常有用 谢谢

    0 回复  |  直到 5 年前
        1
  •  2
  •   Tholle    5 年前

    你可以先提取 itemCode 数组中的值,然后在它们上循环并添加 soldRate 0 如果 项目代码 在每个数组中都存在。

    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);
        2
  •  1
  •   Alvin S. Lee    5 年前

    我将您的过程分解为不同的步骤,因为它使您更清楚您正在做什么(并且更容易调试)。代码可能不像其他答案那样简洁或“优雅”,但我相信这样更容易理解。

    这是一个 code sandbox 它显示了这一点(参见控制台输出)。

    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)
    
        3
  •  0
  •   Alexus    5 年前

    我会在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);