Агрегированная сумма на основе ключей в javascript

У меня есть массив объектов, который выглядит так

var data = [];
    data[0] = {'TrueDestination': 'EU.UK.London',    'EU.UK.London':5, 'EU.UK.Bath':4, 'EU.France.Lyon':1,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':4},
    data[1] = {'TrueDestination': 'EU.UK.Bath',      'EU.UK.London':7, 'EU.UK.Bath':1, 'EU.France.Lyon':8,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':1},
    data[2] = {'TrueDestination': 'EU.France.Paris', 'EU.UK.London':2, 'EU.UK.Bath':2, 'EU.France.Lyon':2,  'EU.France.Paris':6,  'Asia.Japan.Tokyo':3},
    data[3] = {'TrueDestination': 'EU.France.Lyon',  'EU.UK.London':9, 'EU.UK.Bath':0, 'EU.France.Lyon':1,  'EU.France.Paris':0,  'Asia.Japan.Tokyo':2},
    data[4] = {'TrueDestination': 'EU.France.Lyon',  'EU.UK.London':2, 'EU.UK.Bath':4, 'EU.France.Lyon':3,  'EU.France.Paris':7,  'Asia.Japan.Tokyo':7},

Я хотел бы

  • применить функцию к ключам моих объектов в моих данных, чтобы я мог удалить строки, разделенные точками. Так, например, удалите London или UK.London из EU.UK.London, но не UK из UK.London или из EU.UK.London. (Добавлено после комментария Т. Дж. Краудера ниже: чтобы избежать путаницы, вы удаляете движение назад)
  • Затем для каждого объекта взять агрегированную сумму, сгруппированную по ключу

Например, если я удаляю город, последний бит в ключевых строках, я хочу получить массив

 var data = [];
    data[0] = {'TrueDestination': 'EU.UK',     'EU.UK':9, 'EU.France':1,  'Asia.Japan':4},
    data[1] = {'TrueDestination': 'EU.UK',     'EU.UK':8, 'EU.France':8,  'Asia.Japan':1},
    data[2] = {'TrueDestination': 'EU.France', 'EU.UK':4, 'EU.France':8,  'Asia.Japan':3},
    data[3] = {'TrueDestination': 'EU.France', 'EU.UK':9, 'EU.France':1,  'Asia.Japan':2},
    data[4] = {'TrueDestination': 'EU.France', 'EU.UK':6, 'EU.France':10, 'Asia.Japan':7},

Я написал это, чтобы лишить ключей

    function stripper(d, k){
    // k controls how many times you want to strip the string
    for (i=0; i<k; ++i){
        if (d.lastIndexOf('.') > 0){
            d = d.substring(0, d.lastIndexOf('.'))
        }
    }
    return d
   }

а вот моя функция по работе с клавишами - настоящее смущение. (и это не работает!) В любом случае, это то, где я до сих пор

        stripLevel = 1
    columnNames = data.columns.map(d => stripper(d, stripLevel))

    for (j=0; j<columnNames.length; ++j){
            cname = columnNames[j];
            for (i=0; i<data.length; ++i) {
                var _obj = {}
                obj = data[i]
                _keys = Object.keys(obj)
                total = 0
                for (k = 0; k < _keys.length; ++k) {
                    cur = _keys[k]
                    if ((cname != 'model_class') && (stripper(cur, stripLevel) === cname)) {
                        total += parseFloat(obj[cur])
                    }
                    _objTemp = {[stripper(cur, stripLevel)]: total}
                    Object.assign(_obj, _objTemp)
                    total = 0
                }
            }
    }

Любая помощь очень ценится

«применить функцию к ключам моих объектов в моих данных, чтобы я мог удалить строки, разделенные точками. Так, например, удалить London или UK.London из EU.UK.London, но не UK из UK.London или из EU.UK.London " Каковы правила принятия решения о том, что удалять, а что нет? Правила кажутся... странными...
T.J. Crowder 07.04.2019 20:25
"...но не Великобритания из Великобритании.Лондон или из ЕС.Великобритания.Лондон..." Должен ли он ДобавитьEU на UK.London каким-то образом? Если да, то как?
T.J. Crowder 07.04.2019 20:26

Допустим, вы удаляете движение назад, от конца к началу. Или, если так будет понятнее, вы удалите сначала город, а затем страну.

Aenaon 07.04.2019 20:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать новый объект и добавить значения того же ключа.

Он работает с записями объекта и деструктурированной парой ключ/значение k/v и функцией для получения первых частей пунктирных строк и проверки ключа.

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

Наконец объект возвращается.

var data = [{ TrueDestination: 'EU.UK.London', 'EU.UK.London': 5, 'EU.UK.Bath': 4, 'EU.France.Lyon': 1, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 4 }, { TrueDestination: 'EU.UK.Bath', 'EU.UK.London': 7, 'EU.UK.Bath': 1, 'EU.France.Lyon': 8, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 1 }, { TrueDestination: 'EU.France.Paris', 'EU.UK.London': 2, 'EU.UK.Bath': 2, 'EU.France.Lyon': 2, 'EU.France.Paris': 6, 'Asia.Japan.Tokyo': 3 }, { TrueDestination: 'EU.France.Lyon', 'EU.UK.London': 9, 'EU.UK.Bath': 0, 'EU.France.Lyon': 1, 'EU.France.Paris': 0, 'Asia.Japan.Tokyo': 2 }, { TrueDestination: 'EU.France.Lyon', 'EU.UK.London': 2, 'EU.UK.Bath': 4, 'EU.France.Lyon': 3, 'EU.France.Paris': 7, 'Asia.Japan.Tokyo': 7 }],
    result = data.map(o => Object.entries(o).reduce((o, [k, v]) => {
        const firsts = k => k.split('.').slice(0, -1).join('.');
        if (k === 'TrueDestination') {
            o[k] = firsts(v);
        } else {
            k = firsts(k);
            o[k] = (o[k] || 0) + v;
        }
        return o;
    }, {}));

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

Большое спасибо Нина, это работает как шарм. Не могли бы вы кратко описать, как это работает, пожалуйста? Я пытаюсь разобраться с уменьшением карты, но не могу справиться с этим ....

Aenaon 07.04.2019 21:58

Вы также думаете, что что-то подобное можно использовать для вычисления медианы вместо суммы, пожалуйста? Я думаю, мне потребуется каким-то образом собрать все значения в массиве, а в конце отсортировать их и выбрать среднюю точку. Я не прошу вас написать это, просто если вы считаете, что это выполнимо, и намек на то, как следует действовать. Спасибо еще раз!

Aenaon 07.04.2019 22:22

для медианы вам нужен массив и, наконец, выберите значение или среднее значение средних значений отсортированного массива. для среднего вам нужна сумма и счет, и, наконец, возьмите результат деления. в этом случае у вас есть двухэтапная итерация: одна над объектами, а другая над ключами/значениями. после итерации ключ/значение вы можете вернуть желаемую медиану (правда?) или среднее значение.

Nina Scholz 07.04.2019 22:27

Спасибо огромное Нина, всего наилучшего!

Aenaon 07.04.2019 22:29

Другие вопросы по теме