我有一个JSON数组,表示一个对象列表(人)。 每个对象(每个人)都有名称属性,图像和数字数组。
示例:
"people":[
{
"name":"nunu",
"image":"image1",
"numbers":{
"total":50,
"vector":[
10,
20,
5,
10,
5
]
}
}
];
我的目标是更新所有向量并为每个向量附加一些计算。
这就是我的尝试:
this.people = this.people.map((person) => {
return person.numbers.vector.map((num) => {
return Math.round(((num / divider) * 100) / 100);
});
});
问题是people
被我vector
中的数字所取代,我丢失了人数据。
如何在不对任何其他数据进行任何更改的情况下更新矢量?
答案 0 :(得分:1)
由于.map() specification它创建了一个新数组,因此要使用.forEach()
来处理顶级列表:
this.people.forEach(person =>
person.numbers.vector = person.numbers.vector.map(num =>
Math.round(((num / divider) * 100) / 100)
);
);
答案 1 :(得分:0)
如果你使用新的传播操作符和像Babel这样的东西,这就变得微不足道了:
const source = {
"people": [{
"name": "nunu",
"image": "image1",
"numbers": {
"total": 50,
"vector": [
10,
20,
5,
10,
5
]
}
}]
};
const newSource = {
...source,
people: source.people.map(person => {
return {
...person,
numbers: {
...person.numbers,
vector: person.numbers.vector.map(n => Math.round(((n / 2) * 100) / 100))
}
}
})
};
以下是spread运算符的更多内容。
作为旁注,使用spread运算符创建一个新对象,并使用map
创建一个新数组。这样,您将始终拥有一个新对象,并且无法更改旧对象。将const
与此类代码一起使用也是一种很好的做法。
答案 2 :(得分:0)
people = people.map((person) => {
person.numbers.vector = person.numbers.vector.map((num) => {
return Math.round(((num / divider) * 100) / 100);
});
return person;
});
您将向量作为person的值返回,您需要更改向量的值然后返回人。
答案 3 :(得分:0)
尝试使用spread
运算符更新person对象并保存所有数据。例如,将total
值计算为nums的总和:
this.people = this.people.map((person) => {
let total = person.numbers.vector.reduce((prevNum, nextNum) => {
return prevNum + nextNum;
});
return {
...person,
numbers: {
...person.numbers,
total
}
}
});
以同样的方式可以更改矢量值,例如