Javascript 修改JSON对象中的特定值,返回具有修改值的对象的克隆版本?

Javascript 修改JSON对象中的特定值,返回具有修改值的对象的克隆版本?,javascript,Javascript,我正在尝试修改类似以下内容的obj: { "data": [ { "id": "0923f8e0-d090-11ea-8615-9d076fb270e8", "pb_id": "or-portland-188", "state": "Oregon", "city": "

我正在尝试修改类似以下内容的obj:

{
  "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}}}}这就是我的意思,值在newData
geocoding[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}}}}这就是我的意思,值在newData
geocoding[0]
中显示为NaN是用于数组的-这是一个对象。所以
geocoding.lat