Перебор вложенного массива json для создания нового массива

#javascript #arrays #json #javascript-objects

#javascript #массивы #json #javascript-объекты

Вопрос:

Я работаю над лямбда-функцией, которая GET передает данные из одного API и POST передает их другому. Данные представляют собой список контактов со свойствами, например, имя, фамилия, электронная почта и т.д.

Вывод JSON содержит слишком много свойств, которые мне не нужны. Смотрите приведенный Ниже пример кода (фактический код содержит гораздо больше свойств и вложенных массивов / объектов).

 {
  "contacts": [
      {
          "addedAt": 1532803458796,
          "vid": 101
      }
   ],
  "merge-audits": [],
  "properties": {
       "first-name": {
          "value":"hello"
        },
        "last-name": {
          "value":"there"
        },
        "email": {
          "value":"hello@there.com"
        }
... 
...
}
  

Как я могу перебирать каждый объект JSON для создания нового, более простого массива JSON, подобного следующему:

 [
  {
    "email": "example@example.com",
    "first_name": "",
    "last_name": "User"
  },
  {
    "email": "example2@example.com",
    "first_name": "Example",
    "last_name": "User"
  }
]
  

Заранее спасибо за вашу помощь.

Комментарии:

1. JSON — это текст. Когда вы говорите «raw JSON», вы, кажется, действительно подчеркиваете, что это JSON… но так ли это? Или мы начинаем с объекта JavaScript?

2. есть ли в вашем json несколько ключей, называемых properties или что-то в этом роде?

Ответ №1:

попробуйте

 json.map( x => ({
  email:      x.properties.email.value,
  first_name: x.properties['first-name'].value,
  last_name:  x.properties['last-name'].value,
}));
  

 let json = [
{
  "contacts": [{
    "addedAt": 1532803458796,
    "vid": 101
  }],
  "merge-audits": [],
  "properties": {
    "first-name": {
      "value": "hello"
    },
    "last-name": {
      "value": "there",
    },
    "email": {
      "value": "hello@there.com"
    }
  }
},
{
  "contacts": [{
    "addedAt": 1532803458796,
    "vid": 101
  }],
  "merge-audits": [],
  "properties": {
    "first-name": {
      "value": "Tom"
    },
    "last-name": {
      "value": "Smith",
    },
    "email": {
      "value": "tom@smith.com"
    }
  }
}
]

let r = json.map(x => ({
  email:      x.properties.email.value,
  first_name: x.properties['first-name'].value,
  last_name:  x.properties['last-name'].value,
}));

console.log(r);  

Комментарии:

1. Протестировано, отлично сработало и очень эффективно, спасибо!

Ответ №2:

Вы могли бы использовать деструктурирующее назначение для объекта и краткие свойства для сопоставления.

 var data = [{ contacts: [{ addedAt: 1532803458796, vid: 101 }], "merge-audits": [], properties: { "first-name": { value: "hello" }, "last-name": { value: "there" }, email: { value: "hello@there.com" } } }],
    result = data.map(({ properties: {
        'first-name': { value: first_name },
        'last-name': { value: last_name },
         email: { value: email }
    } }) => ({ first_name, last_name, email }));

console.log(result);  

Комментарии:

1. Ваше решение также дает те же результаты. Спасибо за дополнительную информацию. Будет ли это также работать для нескольких объектов в переменной data?

2. это так, потому что данные представляют собой массив, и преобразуется каждый одинаковый организованный объект.