Объедините полудублированные объекты в массив объектов - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы объединить количественные значения объектов, если значения ohmage, допусков и мощности совпадают с предыдущими проверенными объектами. Начальный объект:

var x = [{
    date: "2020",
    ohmage: "1k45",
    quantity: 5000,
    tolerance: 5,
    wattage: 2
}, {
    date: "2020",
    ohmage: "9k34",
    quantity: 1000,
    tolerance: 2,
    wattage: 0.125
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 3000,
    tolerance: 2,
    wattage: 2
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 3500,
    tolerance: 5,
    wattage: 2
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 500,
    tolerance: 5,
    wattage: 0.5
}];

Желаемый объект:

var x = [{
    date: "2020",
    ohmage: "1k45",
    quantity: 8500,
    tolerance: 5,
    wattage: 2
}, {
    date: "2020",
    ohmage: "9k34",
    quantity: 1000,
    tolerance: 2,
    wattage: 0.125
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 3000,
    tolerance: 2,
    wattage: 2
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 500,
    tolerance: 5,
    wattage: 0.5
}];

Я посмотрел на Объединить дублирующиеся объекты в массиве объектов и переделал функцию, но это не так t объединить все объекты, которые должны быть объединены. Моя текущая функция:

var seen = {};
array = array.filter(entry => {
    var previous;
    // Have we seen this ohmage before?
    if (seen.hasOwnProperty(entry.ohmage)) {
        if (entry.tolerance == seen[entry.ohmage].tolerance && entry.wattage == seen[entry.ohmage].wattage) {
            console.log(true)
            // Yes, grab it and add this quantity to it
            previous = seen[entry.ohmage];
            previous.quantity.push(entry.quantity);

            // Don't keep this entry, we've merged it into the previous one
            return false;
        }
    }
    // entry.quantity probably isn't an array; make it one for consistency
    if (!Array.isArray(entry.quantity)) {
        entry.quantity = [entry.quantity];
    }
    // Remember that we've seen it
    seen[entry.ohmage] = entry;

    // Keep this one, we'll merge any others that match into it
    return true;
});

1 Ответ

1 голос
/ 14 апреля 2020

Функция array.filter не может изменять элементы массива, это просто те элементы, для которых функция обратного вызова возвращает true. Для объединения элементов вы можете использовать функцию уменьшения:

const result = array.reduce((acc, entry) =>{
if (acc.filter(item => item.ohmage===entry.ohmage && item.tolerance===entry.tolerance && item.wattage===entry.wattage).length > 0)
{  
  // If an entry with parameters already exists
  let idx = acc.findIndex(item => item.ohmage===entry.ohmage && item.tolerance===entry.tolerance && item.wattage===entry.wattage)
  //Merge items by sum quantities as in example
  acc[idx] = {...acc[idx], quantity: acc[idx].quantity + entry.quantity}
  return acc
}

  // Otherwise adds entry to accumulator as it is
 return [...acc, entry]

}, [])

console.log(result)
<script>
var array = [{
    date: "2020",
    ohmage: "1k45",
    quantity: 5000,
    tolerance: 5,
    wattage: 2
}, {
    date: "2020",
    ohmage: "9k34",
    quantity: 1000,
    tolerance: 2,
    wattage: 0.125
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 3000,
    tolerance: 2,
    wattage: 2
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 3500,
    tolerance: 5,
    wattage: 2
}, {
    date: "2020",
    ohmage: "1k45",
    quantity: 500,
    tolerance: 5,
    wattage: 0.5
}];

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...