Mam tablicę z wartościami

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

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

Powinien sprawdzić, czy nazwy są unikalne, a jeśli znalazły się taka sama nazwa, powinna dodać znaki i dokonać żądanej tablicy z wyraźnymi elementami. Jestem w stanie uzyskać unikalną tablicę, ale nie jest w stanie połączyć znaków. Czy ktoś może pomóc?

1
Harry 4 czerwiec 2018, 11:06

5 odpowiedzi

Najlepsza odpowiedź

Możesz wziąć Map do zbierania wartości i renderowania nowych strun do wyniku.

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);
1
Nina Scholz 4 czerwiec 2018, 08:14

Możesz to zrobić:

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
Yosvel Quintero Arguelles 4 czerwiec 2018, 08:36

Proste podejście byłoby zorientowanie nad nową tablicą za każdym razem, gdy chcesz dodać nową wartość i sprawdzić, czy klucz istnieje. Jeśli zwiększa wartość, jeśli nie dodaj go.

Oto jedno rozwiązanie o tymczasowym obiektu.

// 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
Ognyan M 4 czerwiec 2018, 08:30

Możesz także wybrać się z prostym {X0}} Loop:

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
Ankit Agarwal 4 czerwiec 2018, 08:16

Możesz grupować tablicę za pomocą reduce. Użyj Object.entries, aby przekonwertować obiekt do tablicy i {x2}}, aby utworzyć żądane wyjście.

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);
0
Eddie 4 czerwiec 2018, 08:14