Javascript 如何将2个JSON对象中的特定值添加到新的JSON对象中
我提取了一个国家在对象中出现的次数(如下图所示)。我的问题是我需要地理编码信息与国家名称+出现次数一起,这样我就可以在地图上的实际国家上绘制实际结果 因此,从下面的对象来看,mapToProp函数生成的对象Javascript 如何将2个JSON对象中的特定值添加到新的JSON对象中,javascript,arrays,json,function,object,Javascript,Arrays,Json,Function,Object,我提取了一个国家在对象中出现的次数(如下图所示)。我的问题是我需要地理编码信息与国家名称+出现次数一起,这样我就可以在地图上的实际国家上绘制实际结果 因此,从下面的对象来看,mapToProp函数生成的对象 Germany:3, United Kingdom: 1 但我需要下面这样的东西。因为这是mapbox似乎期望geojson对象的格式 { "type": "FeatureCollection", "features": [ {
Germany:3,
United Kingdom: 1
但我需要下面这样的东西。因为这是mapbox似乎期望geojson对象的格式
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-77.034084142948,
38.909671288923
]
},
"properties": {
"name":'Germany',
"amount": 3
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-77.034084142948,
38.909671288923
]
},
"properties": {
"name":'United Kingdom',
"amount": 4
}
}
]
}
获取国家名称+它们出现的时间
function mapToProp(data, prop) {
return data
.reduce((res, item) => Object
.assign(res, {
[item[prop]]: 1 + (res[item[prop]] || 0)
}), Object.create(null))
;
}
从地理编码器返回的结果(这是一些特定标题出现的国家)
编辑:
function groupByProp(data, prop) {
return data
.reduce((res, item) => {
if (!item[prop]) return res;
let existing = res[item[prop]],
amount = existing && existing.amount ? existing.amount + 1 : 1,
newObj = (()=> {
if (existing && existing.geometry) return {amount, geometry: existing.geometry};
if (item.geometry) return {amount, geometry: item.geometry};
return {amount};
})();
return Object.assign(res, { [item[prop]]: newObj } )
},{});
}
groupByProp(data, 'place_name')
根据更新所需的结果(按类型
分组,然后按地名
分组),您可以通过两种方式完成此操作
- 由于
数组仅包含具有数据
==类型
的对象,因此可以添加该属性并返回嵌套在功能
数组中的对象功能
有更有效的方法来处理这个问题(N1对N^2),但这需要大量的属性名称和操作嵌套的值。我建议保留最初的
groupByProp()
逻辑,然后将数据平坦化为所需的结构。
- 如果您希望为
对具有不同值的元素进行分组,则必须首先按该属性进行分组。考虑到数据结构,这实际上需要相当多的工作,所以在组装之前,请让我知道您是否真的需要解决方案类型
初始答案:
function groupByProp(data, prop) {
return data
.reduce((res, item) => {
if (!item[prop]) return res;
let existing = res[item[prop]],
amount = existing && existing.amount ? existing.amount + 1 : 1,
newObj = (()=> {
if (existing && existing.geometry) return {amount, geometry: existing.geometry};
if (item.geometry) return {amount, geometry: item.geometry};
return {amount};
})();
return Object.assign(res, { [item[prop]]: newObj } )
},{});
}
groupByProp(data, 'place_name')
这可能与您要查找的内容非常接近,除了您提供的数据数组中的第一个元素没有地名
属性外,因此如果您不想以不同的方式更改此行
if(!item[prop])返回res代码>没问题。如果您对我的实现有任何疑问,请告诉我。是的,实际上,我已经更新了底部的OP,这是我正在使用的特定geo placer所期望的格式。虽然代码运行时没有任何错误,我无法绘制任何点,因为它需要“类型”:因此我想将名称和金额移动到geo placer接受的属性键中,用于其他项目。我提供的示例实际上将所有内容保留在几何体
属性中,以便保留嵌套在其中的类型
属性。结果是你在寻找“迄今为止的尝试”下面的内容还是“但我需要类似的东西”?请更新“但我需要类似的东西”下的断言,这正是您想要的,我们可以做到。嘿,谢谢您的回复。我正在浏览你的代码,学到了很多东西,这比解决特定问题更好。我已经继续更新了我刚才提供的OPOops解决方案,但它不正确。。。给我一分钟
function groupByProp(data, prop) {
return data
.reduce((res, item) => {
if (!item[prop]) return res;
let existing = res[item[prop]],
amount = existing && existing.amount ? existing.amount + 1 : 1,
newObj = (()=> {
if (existing && existing.geometry) return {amount, geometry: existing.geometry};
if (item.geometry) return {amount, geometry: item.geometry};
return {amount};
})();
return Object.assign(res, { [item[prop]]: newObj } )
},{});
}
groupByProp(data, 'place_name')