Переупорядочить значения JSON из существующих значений - PullRequest
0 голосов
/ 13 июня 2019

JSON является неструктурированным и не соответствует многим моим требования. Я пробовал это много способов, но это занимает очень много времени когда я предоставлю 100 000 записей

Реализованный код

for (var f in stack.data) {
  var field = new Object();
  for (var o in stack.data[f]['field_values']) {
    field[stack.data[f]['field_values'][o]['field_name']] = stack.data[f]['field_values'][o]['value'];
  }
  stack.data[f]['field_values'] = field;
}
console.log(JSON.stringify(stack, null, 2));

Ввод JSON:

var stack = {
  "data": [{
    "id": 950888888073,
    "name": "www.stackoverflow.com",

    "field_values": [{
        "field_name": "Newsletter?",
        "value": true
      },
      {
        "field_name": "Parent",
        "value": 950888661
      },
      {
        "field_name": "Birthday",
        "value": "2018-04-29"
      },
      {
        "field_name": "Related matter",
        "value": 1055396205
      },
      {
        "field_name": "Referral",
        "value": "Don Ho"
      },
      {
        "field_name": "Spouse",
        "value": "Wo Fat"
      }
    ]
  }]
}

Ожидаемый результат:

{
  "data": [
  {
  "id": 950888888073,
  "name": "www.stackoverflow.com",
  "field_values": {
    "Newsletter?": true,
    "Parent": "Gigi Hallow",
    "Birthday": "2018-04-29",
    "Related": "2012-00121-Sass",
    "Referral": "Don Ho",
    "Spouse": "Wo Fat"
  }

Иногда "field_values" могут быть пустыми. Также необходимо проверить их

     {
      "id": 950821118875,
      "name": "www.google.com",
      "field_values": [],
}

Это в основном перераспределение значений. Здесь значения становятся ключами. На самом деле должен быть один вкладыш, чтобы справиться с этим, но у меня закончились варианты.

Надеюсь, вопрос ясен

1 Ответ

1 голос
/ 13 июня 2019

Вероятно, это поможет объявить переменную для хранения элемента массива, а не выполнять 4 уровня индексации каждый раз в цикле. Вы также можете использовать деструктуризацию для извлечения свойств объекта.

И используйте {} вместо new Object.

Даже если это не повышает производительность, это облегчает чтение кода.

var stack = {
  "data": [{
    "id": 950888888073,
    "name": "www.stackoverflow.com",

    "field_values": [{
        "field_name": "Newsletter?",
        "value": true
      },
      {
        "field_name": "Parent",
        "value": 950888661
      },
      {
        "field_name": "Birthday",
        "value": "2018-04-29"
      },
      {
        "field_name": "Related matter",
        "value": 1055396205
      },
      {
        "field_name": "Referral",
        "value": "Don Ho"
      },
      {
        "field_name": "Spouse",
        "value": "Wo Fat"
      }
    ]
  }]
}

for (var f in stack.data) {
  const field = {};
  const fobj = stack.data[f];
  for (var o in fobj.field_values) {
    const {field_name, value} = fobj.field_values[o];
    field[field_name] = value;
  }
  fobj.field_values = field;
}

console.log(JSON.stringify(stack, null, 2));
...