向 javascript 中的对象添加新值
Adding a new value to an object in javascript
我有以下数组
array = [{
key: '2001',
values: [
{ id : '123a', points: 3, hours: 3 },
{ id : '123a', points: 4, hours: 2 },
{ id : '4444', points: 3, hours: 2 },
{ id : '4444', points: 3, hours: 5 },
]
}, {
key: '2002',
values: [
{ id : '12d3a', points: 5, hours: 2 },
{ id : '12w3a', points: 3, hours: 3 },
]
}]
有了这个功能
const {map, evolve, pipe, groupBy, prop, pluck, sum, toPairs, zipObj} = R;
const a = map(evolve({
values: pipe(
groupBy(prop('id')),
map(pluck('hours')),
map(sum),
toPairs,
map(zipObj(['id', 'hours']))
)
}))
我为每个键(2001、2002..)的每个 ID 收集了所有 "hours"
array = [{
key: '2001',
values: [
{ id : '123a', hours: 5 },
{ id : '4444', hours: 7 }....
现在我想为每个对象添加另一个值,称为 sum。
var sum = (points*hours)/(sum(hours)).
知道我该怎么做吗?我试过更改 const a 但没有用,我不知道 ramda 是否可以执行此操作。也许另一种选择?
array = [{
key: '2001',
values: [
{ id : '123a', hours: 5, sum: 3.4 },
{ id : '4444', hours: 7, sum: 3 }....
尝试关注
var array = [{
key: '2001',
values: [
{ id : '123a', points: 3, hours: 3 },
{ id : '123a', points: 4, hours: 2 },
{ id : '4444', points: 3, hours: 2 },
{ id : '4444', points: 3, hours: 5 },
]
}, {
key: '2002',
values: [
{ id : '12d3a', points: 5, hours: 2 },
{ id : '12w3a', points: 3, hours: 3 },
]
}];
array.forEach((item) => {
var map = {};
item.values.forEach((obj) => {
map[obj.id] = map[obj.id] || [];
map[obj.id].push(obj);
});
var values = [];
Object.values(map).forEach((vals) => {
var n = 0, d = 0;
vals.forEach((val) => {
n += val.points * val.hours;
d += val.hours;
});
values.push({
'id' : vals[0].id,
'hours' : d,
'sum' : n/d
});
});
item.values = values;
});
console.log(array);
你也可以试试下面的逻辑
array.forEach((item) => {
var map = {};
item.values.forEach((obj) => {
map[obj.id] = map[obj.id] || {id : obj.id, n: 0, hours: 0};
map[obj.id].hours += obj.hours;
map[obj.id].n += (obj.points * obj.hours);
});
var values = Object.values(map);
values.forEach((val) => {
val.sum = val.n / val.hours;
delete val.n;
});
item.values = values;
});
这是一个 Ramda 版本,它通过简化为具有 ID、总小时数和总分的中间结构,然后转换为您的最终格式来工作:
const {map, evolve, pipe, groupBy, prop, reduce, values} = R;
const array = [{"key": "2001", "values": [{"hours": 3, "id": "123a", "points": 3}, {"hours": 2, "id": "123a", "points": 4}, {"hours": 2, "id": "4444", "points": 3}, {"hours": 5, "id": "4444", "points": 3}]}, {"key": "2002", "values": [{"hours": 2, "id": "12d3a", "points": 5}, {"hours": 3, "id": "12w3a", "points": 3}]}]
const a = map(evolve({
values: pipe(
groupBy(prop('id')),
map(reduce(
({tp, th}, {id, points, hours}) => ({id, tp: tp + points * hours, th: th + hours})
, {tp: 0, th: 0}
)),
values,
map(({id, th, tp}) => ({id, hours: th, sum: tp/th})),
)
}))
console.log(a(array))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
我有以下数组
array = [{
key: '2001',
values: [
{ id : '123a', points: 3, hours: 3 },
{ id : '123a', points: 4, hours: 2 },
{ id : '4444', points: 3, hours: 2 },
{ id : '4444', points: 3, hours: 5 },
]
}, {
key: '2002',
values: [
{ id : '12d3a', points: 5, hours: 2 },
{ id : '12w3a', points: 3, hours: 3 },
]
}]
有了这个功能
const {map, evolve, pipe, groupBy, prop, pluck, sum, toPairs, zipObj} = R;
const a = map(evolve({
values: pipe(
groupBy(prop('id')),
map(pluck('hours')),
map(sum),
toPairs,
map(zipObj(['id', 'hours']))
)
}))
我为每个键(2001、2002..)的每个 ID 收集了所有 "hours"
array = [{
key: '2001',
values: [
{ id : '123a', hours: 5 },
{ id : '4444', hours: 7 }....
现在我想为每个对象添加另一个值,称为 sum。 var sum = (points*hours)/(sum(hours)).
知道我该怎么做吗?我试过更改 const a 但没有用,我不知道 ramda 是否可以执行此操作。也许另一种选择?
array = [{
key: '2001',
values: [
{ id : '123a', hours: 5, sum: 3.4 },
{ id : '4444', hours: 7, sum: 3 }....
尝试关注
var array = [{
key: '2001',
values: [
{ id : '123a', points: 3, hours: 3 },
{ id : '123a', points: 4, hours: 2 },
{ id : '4444', points: 3, hours: 2 },
{ id : '4444', points: 3, hours: 5 },
]
}, {
key: '2002',
values: [
{ id : '12d3a', points: 5, hours: 2 },
{ id : '12w3a', points: 3, hours: 3 },
]
}];
array.forEach((item) => {
var map = {};
item.values.forEach((obj) => {
map[obj.id] = map[obj.id] || [];
map[obj.id].push(obj);
});
var values = [];
Object.values(map).forEach((vals) => {
var n = 0, d = 0;
vals.forEach((val) => {
n += val.points * val.hours;
d += val.hours;
});
values.push({
'id' : vals[0].id,
'hours' : d,
'sum' : n/d
});
});
item.values = values;
});
console.log(array);
你也可以试试下面的逻辑
array.forEach((item) => {
var map = {};
item.values.forEach((obj) => {
map[obj.id] = map[obj.id] || {id : obj.id, n: 0, hours: 0};
map[obj.id].hours += obj.hours;
map[obj.id].n += (obj.points * obj.hours);
});
var values = Object.values(map);
values.forEach((val) => {
val.sum = val.n / val.hours;
delete val.n;
});
item.values = values;
});
这是一个 Ramda 版本,它通过简化为具有 ID、总小时数和总分的中间结构,然后转换为您的最终格式来工作:
const {map, evolve, pipe, groupBy, prop, reduce, values} = R;
const array = [{"key": "2001", "values": [{"hours": 3, "id": "123a", "points": 3}, {"hours": 2, "id": "123a", "points": 4}, {"hours": 2, "id": "4444", "points": 3}, {"hours": 5, "id": "4444", "points": 3}]}, {"key": "2002", "values": [{"hours": 2, "id": "12d3a", "points": 5}, {"hours": 3, "id": "12w3a", "points": 3}]}]
const a = map(evolve({
values: pipe(
groupBy(prop('id')),
map(reduce(
({tp, th}, {id, points, hours}) => ({id, tp: tp + points * hours, th: th + hours})
, {tp: 0, th: 0}
)),
values,
map(({id, th, tp}) => ({id, hours: th, sum: tp/th})),
)
}))
console.log(a(array))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>