Как суммировать значения из двух объектов с одним общим свойством в jQuery? - PullRequest
1 голос
/ 25 сентября 2019

У меня есть массив таких объектов, как этот:

0: {Id: "D", Inmueble: "00000021", Valexcep: 2}
1: {Id: "D", Inmueble: "00000021", Valexcep: 2}
2: {Id: "D", Inmueble: "00000023", Valexcep: 1}
3: {Id: "D", Inmueble: "00000023", Valexcep: 2}
4: {Id: "D", Inmueble: "00000024", Valexcep: 3}
5: {Id: "D", Inmueble: "00000168", Valexcep: 3}

Мне нужно суммировать значения "Valexcep" из тех объектов, которые имеют одинаковое значение "Inmueble", например, первые два массива

Мне нужно получить этот вывод

0: {Id: "D", Inmueble: "00000021", Valexcep: 4}
2: {Id: "D", Inmueble: "00000023", Valexcep: 3}
4: {Id: "D", Inmueble: "00000024", Valexcep: 3}
5: {Id: "D", Inmueble: "00000168", Valexcep: 3}

Вот код, который у меня есть до сих пор

    var discount = 0;
    var inmueble = "";


    $.each(array, function(i, val) {
        if (val.Id == 'D') {
            discount += val.Valexcep;
            inmueble = val.Inmueble;
            var newObj = {
                id: val.Id,
                Inmueble: val.Inmueble
                Valexcep: val.Valexcep; 
            }               
            array.push(newObj)              
        }

    });

Но не работает, как ожидалось,

Есть идеи, как это выяснить?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вы можете уменьшить массив, взяв массив в качестве результирующего набора, и посмотреть, существует ли объект с таким же Inmueble, а затем обновить Valexcep, в противном случае отправить новый объект в результирующий набор.

var data = [{ Id: "D", Inmueble: "00000021", Valexcep: 2 }, { Id: "D", Inmueble: "00000021", Valexcep: 2 }, { Id: "D", Inmueble: "00000023", Valexcep: 1 }, { Id: "D", Inmueble: "00000023", Valexcep: 2 }, { Id: "D", Inmueble: "00000024", Valexcep: 3 }, { Id: "D", Inmueble: "00000168", Valexcep: 3 }],
    result = data.reduce((r, { Id, Inmueble, Valexcep }) => {
        var temp = r.find(o => o.Inmueble === Inmueble);
        if (temp) {
            temp.Valexcep += Valexcep;
        } else {
            r.push({ Id, Inmueble, Valexcep });
        }
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Группировка с Map.

var data = [{ Id: "D", Inmueble: "00000021", Valexcep: 2 }, { Id: "D", Inmueble: "00000021", Valexcep: 2 }, { Id: "D", Inmueble: "00000023", Valexcep: 1 }, { Id: "D", Inmueble: "00000023", Valexcep: 2 }, { Id: "D", Inmueble: "00000024", Valexcep: 3 }, { Id: "D", Inmueble: "00000168", Valexcep: 3 }],
    result = Array.from(data
        .reduce((m, { Id, Inmueble, Valexcep }) => m.set(
            Inmueble,
            { Id, Inmueble, Valexcep: (m.has(Inmueble) ? m.get(Inmueble).Valexcep : 0) + Valexcep }
        ), new Map)
        .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 25 сентября 2019

Насколько я понимаю, вам сначала нужно сгруппировать ваш элемент по Inmueble, а затем уменьшить их, чтобы получить их итоги. Ceasar Bautista имеет довольно хороший метод группировки по свойству, и мы будем использовать его для создания нового "сгруппированного" массива.:

//https://stackoverflow.com/a/34890276/5784924
function groupBy (xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
};

let input = [
  {Id: "D", Inmueble: "00000021", Valexcep: 2},
  {Id: "D", Inmueble: "00000021", Valexcep: 2},
  {Id: "D", Inmueble: "00000023", Valexcep: 1},
  {Id: "D", Inmueble: "00000023", Valexcep: 2},
  {Id: "D", Inmueble: "00000024", Valexcep: 3},
  {Id: "D", Inmueble: "00000168", Valexcep: 3}
]

// we first group the values by Inmueble
let grouppedValues = groupBy(input, 'Inmueble');

// the functions returns an object with the Inmueble as key, so we parse each key.
// we use reduce because it's easier to returns an object. We could use a simple forEach aswell.
let output = Object.keys(grouppedValues).reduce(function(collector, value) {
  // get the current value from the key we got.
  let currentGrouppedValue = grouppedValues[value];
  
  // for each groupped element, we add the Valexcep value
  let total = 0
  grouppedValues[value].forEach((data) => { 
    total += data.Valexcep;
  });
  
  // the collector is what is return, so we construct a new object with the element we need.
  // in our case, we can use the Id and Inmueble from the first group element since it will
  // always be the same.
  collector.push({
    Id: currentGrouppedValue[0].Id,
    Inmueble: currentGrouppedValue[0].Inmueble,
    Valexcep: total
  });
  
  // we return the updated collector.
  return collector;
}, []);


// do whatever you like with the output.
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...