2

I am working on a react native App Say I have these array list:

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}
]

As you can see, some list got elements other list does not has, and each list item order is desc order by 'soldRate', and each list.length may be different as well.

So the goal is to concate these array list and processing to build a new array list, something like below:

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},             
]

So as you can see, all the 'soldRate' elements from list 1 2 3 4 5 6 above has been concate and generated into new array list 'data' property, the position of each data order is strickly the same as above original list 1 2 3 4 5 6.... if the element value in position is not existing in any of the original list, it is then a '0' value

And eventually the each object in finalAllConcateAndSortedByDataSumList, the data array will be sum up into property 'dataSum'

Then the new list finalAllConcateAndSortedByDataSumList is desc order by dataSum

This is my personal attempt to make it work, but it does not work...

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})

So seeking for help here, code example would be really helpful Thanks

3 Answers 3

2

You could first extract all the unique itemCode values there are in the arrays, and then loop over them and add either the soldRate or 0 to the result if the itemCode is present in each array.

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);

Sign up to request clarification or add additional context in comments.

Comments

1

I broke your process down into various steps, as it makes it clearer what you are doing (and easier to debug). The code may not be as compact or "elegant" as other answers, but I believe it is easier to understand this way.

Here is a code sandbox that shows this in action (see the console output).

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)

Comments

0

I would use a combination of arrays in 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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.