Как создать новую строку json путем динамического объединения элементов из нескольких других строк json

#javascript #arrays #json #object

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

Вопрос:

У меня есть данные json в полях, которые разделены по строкам. Я хочу, чтобы все эти поля были в одной строке. Я хотел бы написать функцию javascript, которая принимает исходные входные данные и выдает выходные данные. Я очень новичок в javascript. Я хотел бы сделать это динамическим способом, чтобы мне не нужно было явно называть новые поля — вместо этого выполните итерацию по всем полям в каждой строке по одному и добавьте их в новую строку с теми же именами / значениями. Заранее спасибо.

Запуск json:

 [
    {
        "name": "Sara Smith",
        "dob": "19831002"
    },
    {
        "title": "director",
        "emails": [
            "ssmith@gmail.com",
            "sarasmith@yahoo.com"
        ]
    },
    {
        "phones": [
            {
                "type": "home",
                "number": "3452345432"
            },
            {
                "type": "work",
                "number": "3452345343"
            }
        ]
    }
]   
  

Желаемое конечное состояние json:

 [
    {
        "name": "Sara Smith",
        "dob": "19831002"
        "title": "director",
        "emails": [
            "ssmith@gmail.com",
            "sarasmith@yahoo.com"
        ]
        "phones": [
            {
                "type": "home",
                "number": "3452345432"
            },
            {
                "type": "work",
                "number": "3452345343"
            }
        ]
    }
]       
  

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

1. Что вы пробовали … о, подождите, у вас уже есть ответы… вы благословлены

Ответ №1:

Используйте reduce :

 const startJSON = [{
    "name": "Sara Smith",
    "dob": "19831002"
  },
  {
    "title": "director",
    "emails": [
      "ssmith@gmail.com",
      "sarasmith@yahoo.com"
    ]
  },
  {
    "phones": [{
        "type": "home",
        "number": "3452345432"
      },
      {
        "type": "work",
        "number": "3452345343"
      }
    ]
  }
];

const endJSON = [startJSON.reduce((acc, curr) => ({ ...acc, ...curr }))];

console.log(endJSON);  
 .as-console-wrapper { max-height: 100% !important; top: auto; }  

Ответ №2:

Одним из возможных решений является использование Array.reduce() в сочетании с Object.assign():

 const input = [
  {"name": "Sara Smith", "dob": "19831002"},
  {
    "title": "director",
    "emails": ["ssmith@gmail.com", "sarasmith@yahoo.com"]
  },
  {
    "phones": [
      {"type": "home", "number": "3452345432"},
      {"type": "work", "number": "3452345343"}
    ]
  }
];

let output = input.reduce((acc, curr) =>
{
    Object.assign(acc[0], curr);
    return acc;
}, [{}]);

console.log(output);  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}