У меня есть массив объектов, который выглядит так
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
}
}
}
Любая помощь очень ценится
EU
на UK.London
каким-то образом? Если да, то как?
Допустим, вы удаляете движение назад, от конца к началу. Или, если так будет понятнее, вы удалите сначала город, а затем страну.
Вы можете создать новый объект и добавить значения того же ключа.
Он работает с записями объекта и деструктурированной парой ключ/значение 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; }
Большое спасибо Нина, это работает как шарм. Не могли бы вы кратко описать, как это работает, пожалуйста? Я пытаюсь разобраться с уменьшением карты, но не могу справиться с этим ....
Вы также думаете, что что-то подобное можно использовать для вычисления медианы вместо суммы, пожалуйста? Я думаю, мне потребуется каким-то образом собрать все значения в массиве, а в конце отсортировать их и выбрать среднюю точку. Я не прошу вас написать это, просто если вы считаете, что это выполнимо, и намек на то, как следует действовать. Спасибо еще раз!
для медианы вам нужен массив и, наконец, выберите значение или среднее значение средних значений отсортированного массива. для среднего вам нужна сумма и счет, и, наконец, возьмите результат деления. в этом случае у вас есть двухэтапная итерация: одна над объектами, а другая над ключами/значениями. после итерации ключ/значение вы можете вернуть желаемую медиану (правда?) или среднее значение.
Спасибо огромное Нина, всего наилучшего!