Как добавить массив с различными элементами и добавить значение повторяющихся элементов, используя JavaScript - PullRequest
0 голосов
/ 04 июня 2018

У меня есть массив со значениями

myarray=["Mark:40", "John:20", "Sofia: 60", "Mark:30"]

desiredArray=["Mark:70", "John:20", "Sofia: 60"]

Он должен проверить, являются ли имена уникальными, и, если он нашел одно и то же имя несколько раз, он должен добавить метки и создать нужный массив с различными элементами.Я могу получить уникальный массив, но не могу объединить оценки.Может ли кто-нибудь помочь?

Ответы [ 5 ]

0 голосов
/ 04 июня 2018

Вы можете сделать:

const array = ["Mark:40", "John:20", "Sofia: 60", "Mark:30"];
const temp = array.reduce((a, c, i, arr) => {
  const u = c.split(':');
  a[u[0]] = a[u[0]] + +u[1] || +u[1];
  return a;
}, {});
const result = Object.keys(temp)
  .map(u => `${u}:${temp[u]}`);

console.log(result);
0 голосов
/ 04 июня 2018

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

Вот одно решение с временным объектом.

// Initial array
const myarray = ["Mark:40", "John:20", "Sofia: 60", "Mark:30"]
// Temporary object used to calculate values
const desired = {};

for (let value of myarray) {
  // Index of the first digit in the string
  const separatorIndex = value.indexOf(':') + 1;
  // Key is everything before the first digit including the :
  let key = value.substr(0, separatorIndex);
  // If the key isn't present in the object add it
  if (desired[key] === undefined) {
    desired[key] = 0;
  }
  // Add the value of the key to the temporary object
  // this combines the values of equal keys
  desired[key] += parseFloat(value.substr(separatorIndex));
}

const desiredArray = [];
// Create an array from all values
for (let key in desired) {
  desiredArray.push(key + desired[key].toString());
}

console.log(desiredArray);
0 голосов
/ 04 июня 2018

Вы можете взять Map для сбора значений и рендеринга новых строк для результата.

var array = ["Mark:40", "John:20", "Sofia: 60", "Mark:30"],
    result = Array.from(
        array.reduce(
            (m, s) => (([k, v]) => m.set(k, (m.get(k) || 0) + +v))(s.split(/:\s*/)),
            new Map
        ).entries(),
        a => a.join(':')
    );

console.log(result);
0 голосов
/ 04 июня 2018

Вы также можете выбрать простой цикл for:

var myarray=["Mark:40", "John:20", "Sofia: 60", "Mark:30"];
for(var i=0; i<myarray.length; i++){
  var splitVal = myarray[i].split(":");
  var nameI = splitVal[0];
  var scoreI = parseInt(splitVal[1]);
  for(var j=i+1; j<myarray.length; j++){
    splitVal = myarray[j].split(":");
    var nameJ = splitVal[0];
    if(nameI === nameJ){
      scoreI += parseInt(splitVal[1]);
      myarray.splice(j,1);
    }
  }
   myarray[i] = nameI+":"+scoreI;
}
console.log(myarray);
0 голосов
/ 04 июня 2018

Вы можете сгруппировать массив, используя reduce.Используйте Object.entries для преобразования объекта в массив и map для формирования требуемого вывода.

let myarray = ["Mark:40", "John:20", "Sofia: 60", "Mark:30"];

let desiredArray = Object.entries(myarray.reduce((c, v) => {
  let [n, a] = v.split(':');
  c[n] = c[n] || 0;
  c[n] += +a;
  return c;
}, {})).map(o => o[0] + ":" + o[1]);

console.log(desiredArray);
...