我有一个看起来像这样的对象数组
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
。 (在T.J. Crowder的评论后添加:为避免混淆,您删除了倒退) 例如,如果我剥离了城市,即字符串中的最后一位,我想以数组结尾
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
}
}
}
任何帮助表示赞赏
答案 0 :(得分:4)
您可以创建新对象并添加相同键的值。
它与对象的条目和已解构的键/值对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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }