Обновите атрибут и удалите повторяющийся элемент в массиве из JavaScript - PullRequest
1 голос
/ 30 мая 2019

У меня проблема с кодом. Вот мой массив

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
  ]

Проблема в том, что мне нужно, чтобы мой массив выглядел следующим образом.

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 3,
    numberHoursSpent: (1+2+4)/(1+1+1),
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 2,
    numberHoursSpent: (3+5)/(1+3),
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },

  ]
что эквивалентно этому

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 3,
    numberHoursSpent: 2.33,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 2,
    numberHoursSpent: 2,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },

  ]

Сначала я нахожу одни и те же объекты в массиве, если они имеют одинаковые атрибуты «name». Затем я суммирую все атрибуты numberHoursSpent и делю их на сумму атрибутов numberSoldLodgings из этих объектов. Затем я удаляю все те же элементы, только сохраняю уникальный. P / S: объекты одинаковы, если они имеют одинаковые атрибуты name Вот что я попробовал.

handleData = arr => {
  var firstElementIndex =0;
  const final = []
  var filteredArray = []
  arr.map((e,i)=>{
    if(final.includes(e.name)){
      var k = k+arr[i].numberHoursSpent;
      firstElementIndex = final.indexOf(e.name);
      arr[firstElementIndex].numberHoursSpent +=  arr[i].numberHoursSpent
      filteredArray= arr.filter(item => item !== arr[i] )
    }
    else{
      final.push(e.name)
    }
    if(i == arr.length-1){
      arr[firstElementIndex].numberHoursSpent /= k
    }
  })

  return filteredArray;    
}

Пожалуйста, помогите мне, спасибо.

Ответы [ 4 ]

2 голосов
/ 30 мая 2019

Используйте reduce и map с деструктуризацией, распространением и Object.values:

const data = [{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:1,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:2,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 2",numberSoldLodging:1,numberHoursSpent:3,mail:"sale2@gmail.com",id:"5cef5a62b9c3113764e2183b",created:1559190114548,updated:1559190114548},{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:4,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 2",numberSoldLodging:3,numberHoursSpent:5,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810}];
const res = Object.values(data.reduce((acc, { name, numberSoldLodging, numberHoursSpent, ...rest }) => {
  acc[name] = acc[name] || { name, numberSoldLodging: 0, numberHoursSpent: 0, ...rest };
  acc[name].numberSoldLodging += numberSoldLodging;
  acc[name].numberHoursSpent += numberHoursSpent;
  return acc;
}, {})).map(({ numberSoldLodging, numberHoursSpent, ...rest }) => ({ numberSoldLodging, numberHoursSpent: numberHoursSpent / numberSoldLodging, ...rest }));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Обратите внимание, что первая строка в функции reduce выполняет дубликат, поэтому вам не нужен дополнительный вызов filter в конце.

1 голос
/ 30 мая 2019

function foo(arr) {
  let dict = {}
  arr.forEach(x => {
    if (dict[x.name]) {
      let y = dict[x.name]
      dict[x.name]['numberHoursSpent'] = y['numberHoursSpent'] + x['numberHoursSpent']
      dict[x.name]['numberSoldLodging'] = y['numberSoldLodging'] + x['numberSoldLodging']
    } else {
      dict[x.name] = x
    }
  })
  return Object.keys(dict).map(x => {
    dict[x]['numberHoursSpent'] = dict[x]['numberHoursSpent'] / dict[x]['numberSoldLodging']
    return dict[x]
  })
  // return dict
}

let arr = [{
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
]

let y = foo(arr)
console.log(y)
0 голосов
/ 30 мая 2019

Попробуйте это:

const qq = [
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
  ];
  
  let p = new Map();
  for (let q of qq) {
    let s = p.get(q.name)
    if(s) {
      s.numberSoldLodging += q.numberSoldLodging;
      s.numberHoursSpent += q.numberHoursSpent;
      p.set(q.name, s);
    } else {
      p.set(q.name, q);
    }
    
  }
  
  

const result = [];
p.forEach((val, key, map) => {
  val.numberHoursSpent = val.numberHoursSpent / val.numberSoldLodging;
  result.push(val)
});

console.log(result);
0 голосов
/ 30 мая 2019

Вы можете попробовать как,

let array = [{
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
];


function filteredArray(array){
  let filteredArr = [];
  // Initialize the array
  filteredArr.push(array[0]);
  
  // Filtered the array
  for(let i=1; i<array.length; i++){
    let elementFound = false;
    
    for(let j=0; j<filteredArr.length; j++){
      if(array[i].name === filteredArr[j].name){ 
        elementFound = true;
        filteredArr[j].numberSoldLodging += array[i].numberSoldLodging;
        filteredArr[j].numberHoursSpent += array[i].numberHoursSpent;
      }
    }
    
    if(!elementFound)
      filteredArr.push(array[i]);
  }
  
  // Modified the 'numberHoursSpent'
  filteredArr.forEach(el => {
      el.numberHoursSpent /= el.numberSoldLodging;
      el.numberHoursSpent = parseFloat(el.numberHoursSpent.toFixed(2));
      });
  
  // Note : I have added toFixed for above long float integer '2.33333333333333333'
  
  return filteredArr;
}

console.log(filteredArray(array));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...