Javascript 修改JSON对象中的特定值,返回具有修改值的对象的克隆版本?
我正在尝试修改类似以下内容的obj:Javascript 修改JSON对象中的特定值,返回具有修改值的对象的克隆版本?,javascript,Javascript,我正在尝试修改类似以下内容的obj: { "data": [ { "id": "0923f8e0-d090-11ea-8615-9d076fb270e8", "pb_id": "or-portland-188", "state": "Oregon", "city": "
{
"data": [
{
"id": "0923f8e0-d090-11ea-8615-9d076fb270e8",
"pb_id": "or-portland-188",
"state": "Oregon",
"city": "Portland",
"date": "2020-07-27T00:00:00.000000Z",
"title": "Journalist shot in the face",
"description": null,
"data": null,
"geocoding": { "lat": 45.5051064, "long": -122.6750261 }
},
{
...
},
]
}
我需要进入“地理编码”键的每个实例,稍微修改lat/long值,因为我拥有的所有坐标都是相同的
我有一个添加少量随机性的函数,但是我在访问值和获取返回修改值的整个对象时遇到了问题
如果您需要进入并更改所有的lat/long值(为了演示起见,让我们将它们全部乘以0),您将如何做到这一点
编辑:
这是我的解决方案,谢谢@cyberwombat
const newData = pbdb.data.map(item => {
const x = item.geocoding.lat;
const y = item.geocoding.long;
return {
...item,
geocoding: {
lat: parseFloat(x) + 2 * 0.05 * (Math.random() - 0.5),
long: parseFloat(y) + 2 * 0.05 * (Math.random() - 0.5),
},
};
});
您可以像这样通过它映射:
const newData = data.map(item => {
return { ...item, geocoding: { lat: 45.5051064 * 2, long: -122.6750261 * 2 } }
}
或者使用与项
无关的值-这里我调用外部函数来随机化或执行任何操作:
// Some geo
const someLat = origLat => {
return 111 // could generate something random
}
const someLong = origLong => {
return origLong * 2 // could generate something random
}
const newData = data.map(item => {
const { geocoding: { lat, long }} = item // Double spread...
return { ...item, geocoding: { lat: someLat(lat), long: someLong(long) } }
}
以下是地图上的信息:
和用于合并对象的spread操作符:您可以通过它映射,如下所示:
const newData = data.map(item => {
return { ...item, geocoding: { lat: 45.5051064 * 2, long: -122.6750261 * 2 } }
}
或者使用与项
无关的值-这里我调用外部函数来随机化或执行任何操作:
// Some geo
const someLat = origLat => {
return 111 // could generate something random
}
const someLong = origLong => {
return origLong * 2 // could generate something random
}
const newData = data.map(item => {
const { geocoding: { lat, long }} = item // Double spread...
return { ...item, geocoding: { lat: someLat(lat), long: someLong(long) } }
}
以下是地图上的信息:
和用于合并对象的spread操作符:您可以尝试以下方法
const{data}={
数据:[
{
id:“0923f8e0-d090-11ea-8615-9d076fb270e8”,
pb_id:“or-portland-188”,
州:“俄勒冈州”,
城市:“波特兰”,
日期:“2020-07-27T00:00:00.000000Z”,
标题:“记者脸部中弹”,
description:null,
数据:空,
地理编码:{lat:45.5051064,长:-122.6750261},
},
],
}
const res=data.map((元素)=>{
element.geocoding.lat+=1
element.geocoding.long+=1
//如有任何其他修改,请进行
返回元素
})
console.log(res)
您可以尝试以下方法
const{data}={
数据:[
{
id:“0923f8e0-d090-11ea-8615-9d076fb270e8”,
pb_id:“or-portland-188”,
州:“俄勒冈州”,
城市:“波特兰”,
日期:“2020-07-27T00:00:00.000000Z”,
标题:“记者脸部中弹”,
description:null,
数据:空,
地理编码:{lat:45.5051064,长:-122.6750261},
},
],
}
const res=data.map((元素)=>{
element.geocoding.lat+=1
element.geocoding.long+=1
//如有任何其他修改,请进行
返回元素
})
console.log(res)
Ahh!Spread操作员,这对一帮人很有帮助。我想我不应该说所有的值都是相同的,但它们中有很多是相同的。我可以在不使用映射循环中的实际值的情况下执行此操作吗?类似于{lat:x*2,long:x*2}的东西。这将是理想的。你当然可以使用外部价值观,如果这是你想要的mean@EthanHargrave添加了一个使用外部函数的示例-传递原始数据,但执行任何操作的选项。const newData=pbdb.data.map(item=>{const x=item.geocoding[0]const y=item.geocoding[1]返回{…item,geocoding:{lat:parseFloat(x)*2,long:parseFloat(y)*2}}}}这就是我的意思,值在newDatageocoding[0]
中显示为NaN是用于数组的-这是一个对象。所以geocoding.lat
Ahh!Spread操作员,这对一帮人很有帮助。我想我不应该说所有的值都是相同的,但它们中有很多是相同的。我可以在不使用映射循环中的实际值的情况下执行此操作吗?类似于{lat:x*2,long:x*2}的东西。这将是理想的。你当然可以使用外部价值观,如果这是你想要的mean@EthanHargrave添加了一个使用外部函数的示例-传递原始数据,但执行任何操作的选项。const newData=pbdb.data.map(item=>{const x=item.geocoding[0]const y=item.geocoding[1]返回{…item,geocoding:{lat:parseFloat(x)*2,long:parseFloat(y)*2}}}}这就是我的意思,值在newDatageocoding[0]
中显示为NaN是用于数组的-这是一个对象。所以geocoding.lat