JS сокращает список на основе одного из его свойств - PullRequest
0 голосов
/ 24 января 2019

Я пишу часть метода в ответ JS, скажем, у меня есть список, как показано ниже.

const itemList = [
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "23/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 50,
        "KenIncome": 100,
        "freeCash": 30
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 200,
        "KenIncome": 100,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "22/01/2019",
        "AnnaIncome": 120,
        "PeterIncome": 120,
        "KenIncome": 30,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "22/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 150,
        "KenIncome": 50,
        "freeCash": 60
    },
] 

Я хочу сделать .reduce, чтобы список содержал меньше элементов только по дате. Например, в приведенном выше списке фактически есть только две даты 22/01/2019 и 23/01/2019. Я хочу сократить размер списка по дате каждого объекта. Таким образом, доход каждого человека будет складываться под собственным именем. В конце концов, список станет только 2 объекта. И некоторые свойства удаляются в новом списке например, ниже «id» и «tillpoint» удаляются, а остальные свойства суммируются вместе:

let itemList = [
    {
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 250,
        "KenIncome": 200,
        "freeCash": 80
    },
    {
        "date": "22/01/2019",
        "AnnaIncome": 220,
        "PeterIncome": 280,
        "KenIncome": 80,
        "freeCash": 110
    }
]

То, что я пробовал здесь, похоже на приведенное ниже, но оно не работает.

itemList.reduce((a, b) => ({ date: a.AnnaIncome + b.AnnaIncome, a.PeterIncome + b.PeterIncome, a.KenIncome + b.KenIncome, a.freeCash + b.freeCash }));

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Вы можете использовать уменьшить и спред оператор.

Итак, вот что я делаю, я беру динамические свойства, которые вы хотите добавить непосредственно к вашемуВывод без каких-либо манипуляций в ...rest и остальное я беру соответствующие имена.

После того, как я проверяю, существует ли ключ данных, я добавляю ...rest и добавляю freeCash к существующему значению.Если нет, то мы создаем новый ключ с датой и соответствующим значением.

const itemList = [{"id":3295042,"tillPoint":"A","date":"23/01/2019","AnnaIncome":100,"PeterIncome":50,"KenIncom":100,"freeCash":30},{"id":3295042,"tillPoint":"B","date":"23/01/2019","AnnaIncome":300,"PeterIncome":200,"KenIncom":100,"freeCash":50},{"id":3295042,"tillPoint":"A","date":"22/01/2019","AnnaIncome":120,"PeterIncome":120,"KenIncom":30,"freeCash":50},{"id":3295042,"tillPoint":"B","date":"22/01/2019","AnnaIncome":100,"PeterIncome":150,"KenIncom":50,"freeCash":60},]

const op = itemList.reduce((output,current)=>{
  let {id,tillPoint,date,freeCash,...rest} = current
 
  if(output[date]){
    output[date] = {
      ...output[date],
      ...rest,
      date,
      freeCash: output[date].freeCash +freeCash
    }
  } else {
    output[date] ={
      ...rest,
      date,
      freeCash
    }
  }
  return output
},{})

console.log(Object.values(op))
0 голосов
/ 24 января 2019

Может быть так:

const itemList = [
    { "id": 3295042, "tillPoint": "A", "date": "23/01/2019", "AnnaIncome": 100, "PeterIncome": 50,  "KenIncome": 100, "freeCash": 30 },
    { "id": 3295042, "tillPoint": "B", "date": "23/01/2019", "AnnaIncome": 300, "PeterIncome": 200, "KenIncome": 100, "freeCash": 50 },
    { "id": 3295042, "tillPoint": "A", "date": "22/01/2019", "AnnaIncome": 120, "PeterIncome": 120, "KenIncome": 30,  "freeCash": 50 },
    { "id": 3295042, "tillPoint": "B", "date": "22/01/2019", "AnnaIncome": 100, "PeterIncome": 150, "KenIncome": 50,  "freeCash": 60 },
];


var new_itemList=[];

for(var key in itemList){
	var new_key = -1;
	for(var keyn in new_itemList){
	   if(new_itemList[keyn].date == itemList[key].date){
	   	  new_key = parseInt(keyn, 10);
	   }
	}
	if(new_key == -1){
		new_itemList.push({'date':itemList[key].date, 'AnnaIncome': itemList[key].AnnaIncome, 'PeterIncome': itemList[key].PeterIncome, 'KenIncome': itemList[key].KenIncome, 'freeCash': itemList[key].freeCash});
	}else{
       new_itemList[new_key].AnnaIncome +=  itemList[key].AnnaIncome;
       new_itemList[new_key].PeterIncome +=  itemList[key].PeterIncome;
       new_itemList[new_key].KenIncome +=  itemList[key].KenIncome;
       new_itemList[new_key].freeCash +=  itemList[key].freeCash;
	}
}
console.log(new_itemList);
0 голосов
/ 24 января 2019

Вы должны сгруппировать по дате, что легко сделать с помощью хеш-таблицы:

 const byDate = new Map;

 for(const { date, id, tillPoint, ...rest } of itemList) {
   if(byDate.has(date)) {
     const dupe = byDate.get(date);
     for(const [k, v] of Object.entries(rest))
       dupe[k] += v;
   } else {
     byDate.set(date, { date, ...rest });
   }
}

const result = [...byDate.values()];

Конечно, вы легко можете жестко закодировать дополнения как dupe.something += rest.something, если производительность так важна.

...