Javascript 如何将2个JSON对象中的特定值添加到新的JSON对象中

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": [ {

我提取了一个国家在对象中出现的次数(如下图所示)。我的问题是我需要地理编码信息与国家名称+出现次数一起,这样我就可以在地图上的实际国家上绘制实际结果

因此,从下面的对象来看,mapToProp函数生成的对象

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')