Как преобразовать объект массива json в массив json - PullRequest
0 голосов
/ 25 января 2019

** Сценарий: **

  • Я использую lodash для удаления пустого ключа из моего JSON.
  • Но когда он удаляет ключи, он преобразует мой массивв объекте, например,

    {
    "projection": "Miller",
    "series": [
        {
            "mapPolygons": {
            "states": {
                "hover": {
                    "properties": {
                        "fill": "#67b7dc"
                    }
                }
            }
        },
        "heatRules": {
            "0": {
                "min": "#a82626",
                "max": "#AAAA00"              
            }
        },
        "data": {
            "0": {
                "id": "US",
                "value": 3461.37
            },
            "1": {
                "id": "DE",
                "value": 2858.09
            },
            "2": {
                "id": "NO",
                "value": 3418.87
            },
            "3": {
                "id": "ES",
                "value": 3522.46
            }
        }
    }
    ],
     "zoomControl": {
    "slider": {
        "height": 100
    }
    },
      "titles": {
        "0": {
        "fontSize": 20
        }
    },
    "homeZoomLevel": 1
    }
    

Проблема:

Если вы видите в приведенном выше коде есть свойство heatRules, которое является массивом послепреобразование его преобразуется в объект 0, опять же, если вы видите атрибут данных, он делает то же самое, если вы видите атрибут заголовков, он делает то же самое там.

Я использовал приведенный ниже код ссылки для удаления пустого объекта и нулевого объекта:

Почему lodash преобразует мой массив в объект?

Входные данные:

    {
"projection": "Miller",
"series": [
    {
    "mapPolygons": {
    "states": {
        "hover": {
            "properties": {
                "fill": "#67b7dc",
                "size": ""
            }
        }
    }
},
"heatRules": [
     {
        "min": "#a82626",
        "max": "#AAAA00",
         "fill": null              
    }
],
"data": [
    {
        "id": "US",
        "value": 3461.37
    },
    {
        "id": "DE",
        "value": 2858.09
    },
    {
        "id": "NO",
        "value": 3418.87
    },
    {
        "id": "ES",
        "value": 3522.46
    }
]
}
],
     "zoomControl": {
"slider": {
    "height": 100
}
},
  "titles": [
   {
    "fontSize": 20,
   "fontColor": "" 
    }
],
"homeZoomLevel": 1
}

Выходные данные:

{
"projection": "Miller",
"series": [
    {
    "mapPolygons": {
    "states": {
        "hover": {
            "properties": {
                "fill": "#67b7dc"
            }
        }
    }
},
"heatRules": [
     {
        "min": "#a82626",
        "max": "#AAAA00"              
    }
],
"data": [
    {
        "id": "US",
        "value": 3461.37
    },
    {
        "id": "DE",
        "value": 2858.09
    },
    {
        "id": "NO",
        "value": 3418.87
    },
    {
        "id": "ES",
        "value": 3522.46
    }
]
}
],
     "zoomControl": {
"slider": {
    "height": 100
}
},
  "titles": [
   {
    "fontSize": 20 
    }
],
"homeZoomLevel": 1
}

ЕслиВы видите выше вывод, он удаляет пустой и пустой ключ из свойств -> size, heatRulues -> fill и из заголовка удаляет fontColor.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

ШАГИ

  1. Перебрать свойство HeatRules (поскольку это массив, поэтому там может быть несколько объектов)
  2. Перебирать свойства каждого объекта в heatRules
  3. Удалить все свойства, имеющие значение null

let data = {
  "projection": "Miller",
  "series": [{
    "mapPolygons": {
      "states": {
        "hover": {
          "properties": {
            "fill": "#67b7dc",
            "size": ""
          }
        }
      }
    },
    "heatRules": [{
      "min": "#a82626",
      "max": "#AAAA00",
      "fill": null
    }],
    "data": [{
        "id": "US",
        "value": 3461.37
      },
      {
        "id": "DE",
        "value": 2858.09
      },
      {
        "id": "NO",
        "value": 3418.87
      },
      {
        "id": "ES",
        "value": 3522.46
      }
    ]
  }],
  "zoomControl": {
    "slider": {
      "height": 100
    }
  },
  "titles": [{
    "fontSize": 20,
    "fontColor": ""
  }],
  "homeZoomLevel": 1
}

data.series[0].heatRules.forEach(hr => {
  Object.keys(hr).forEach(p => {
    if (hr[p] === null) {
      delete hr[p]
    }
  })
})

console.log(data)
0 голосов
/ 25 января 2019

Я пытался Почему lodash преобразовывает мой массив в объект? Например, и он работает.проверьте код ниже.

let a = {
  "projection": "Miller",
  "series": [
    {
      "mapPolygons": {
        "states": {
          "hover": {
            "properties": {
              "fill": "#67b7dc",
              "size": ""
            }
          }
        }
      },
      "heatRules": [
        {
          "min": "#a82626",
          "max": "#AAAA00",
          "fill": null
        }
      ],
      "data": [
        {
          "id": "US",
          "value": 3461.37
        },
        {
          "id": "DE",
          "value": 2858.09
        },
        {
          "id": "NO",
          "value": 3418.87
        },
        {
          "id": "ES",
          "value": 3522.46
        }
      ]
    }
  ],
  "zoomControl": {
    "slider": {
      "height": 100
    }
  },
  "titles": [
    {
      "fontSize": 20,
      "fontColor": ""
    }
  ],
  "homeZoomLevel": 1
}

removeFalses = (obj)=> {
    return _.transform(obj, function (o, v, k) {

      if (v && typeof v === 'object' && !_.isArray(v)) {

        if (v !== '') {
          o[k] = removeFalses(v);
        }

      } else if(_.isArray(v)) {
  if(!o.hasOwnProperty(k)) o[k] = [];

  //And if it is array loop through it

  _.forEach(v, function(v1, k1) {
     o[k].push(removeFalses(v1));
  });

  }else if (v === false) {
        o[k] = v;
      } else if (v) {
        o[k] = v;
      }
    });
  }

console.log(removeFalses(a)) //desired output
0 голосов
/ 25 января 2019

Если ваш код использует

typeof v === 'object'

, он вернет true для arrays.

Чтобы проверить array, используйте

Array.isArray(t)

Обработка array как object и итерация по ключам приведут к вашей проблеме.

Пример функции для рекурсии, но не для обработки массивов

function removeFalsies(obj) {
  return _.transform(obj, function(o, v, k, l) {
      if (Array.isArray(obj) {
          for (let arrItem of obj) {
            removeFalsies(arrItem);
          }
          return
        }
        // else not array...
      })
  }
...