Объединить объекты JSON внутри массива

У меня есть массив JSON, как показано ниже

[
{"Name" : "Arrow",
"Year" : "2001"
},

{"Name" : "Arrow",
"Type" : "Action-Drama"
},
{ "Name" : "GOT",
"Type" : "Action-Drama"
}
]

и я пытаюсь преобразовать это в

[
  { 
    "Name" : "Arrow",
    "Year" : "2001",
    "Type" : "Action-Drama",
  },
  {
   "Name" : "GOT",
   "Type" : "Action-Drama"
  }
]

Любая помощь очень ценится.

Спасибо.

Создайте словарь (просто пустой объект) и используйте значение или ваше свойство «Имя» в качестве ключа. Затем используйте Object.assign(), чтобы объединить элементы.

Christoph Lütjen 08.04.2019 11:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать reduce() и findIndex()

let data = [
{"Name" : "Arrow",
"Year" : "2001"
},

{"Name" : "Arrow",
"Type" : "Action-Drama"
},
{ "Name" : "GOT",
"Type" : "Action-Drama"
}
]


let res = data.reduce((ac,a) => {
  let ind = ac.findIndex(x => x.Name === a.Name);
  ind === -1 ? ac.push({...a}) : ac[ind] = {...ac[ind],...a};
  return ac;


},[])
console.info(res)
Ответ принят как подходящий

Вы можете использовать метод Array#reduce.

let data = [{
    "Name": "Arrow",
    "Year": "2001"
  },

  {
    "Name": "Arrow",
    "Type": "Action-Drama"
  },
  {
    "Name": "GOT",
    "Type": "Action-Drama"
  }
]


let res = data.reduce((obj, { Name, ...rest }) => {
  // define property(key as Name) if not defined
  obj[Name] = obj[Name] || { Name };
  // copy rest properties to object
  Object.assign(obj[Name], rest);
  // return object reference
  return obj;
  // set initial value as epty object
}, {})

// or one liner solution
// let res = data.reduce((obj, { Name, ...rest }) => (obj[Name] = {... obj[Name] || {Name}, ...rest },obj), {})



// now res holds an object where key id name
// get values as an array using Object.values method
console.info(Object.values(res))

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

let data = [{
    "Name": "Arrow",
    "Year": "2001"
  },

  {
    "Name": "Arrow",
    "Type": "Action-Drama"
  },
  {
    "Name": "GOT",
    "Type": "Action-Drama"
  }
]

// initialize array for result
let res = [],
  // an object for array value reference by name
  ref = {};

// iterate over main array
for (let i = 0; i < data.length; i++) {
  // check property defined in refeence object(Name)
  // if not then define and pushj it to result array
  if (!(data[i].Name in ref)) res.push(ref[data[i].Name] = {});
  // copy propety to object
  Object.assign(ref[data[i].Name], data[i]);
}

console.info(Object.values(res))

Можно ли обойтись обычной for итерацией? Я просто хочу понять.

rɑːdʒɑ 08.04.2019 11:29

@rɑːdʒɑ : да, возможно...

Pranav C Balan 08.04.2019 11:30

Можете ли вы помочь мне понять, как это может быть достижимо?

rɑːdʒɑ 08.04.2019 11:32

@rɑːdʒɑ : обновление

Pranav C Balan 08.04.2019 11:36

Пожалуйста, попробуйте это

var object1 = {
  apple: 0,
  banana: { weight: 52, price: 100 },
  cherry: 97
};
var object2 = {
  banana: { price: 200 },
  durian: 100
};

// Merge object2 into object1, recursively
$.extend( true, object1, object2 );

console.info( JSON.stringify( object1 ) );

Ссылка:

http://researchhubs.com/post/computing/javascript/merge-content-of-objects.html

researchhubs.com/post/computing/javascript/… проверь эту ссылку, брат.
Sajid Ijaz 08.04.2019 11:29

ОП не упомянул, что он использует jQuery. Кроме того, хотя это объединяет объекты, это не решает проблему, с которой сталкивается OP: объединение объектов, которые являются внутри одного массива.

David 08.04.2019 11:33

Используйте reduce и Object.assign, чтобы объединить элементы внутри массива:

const data = [{
  "Name" : "Arrow",
  "Year" : "2001"
}, {
  "Name" : "Arrow",
  "Type" : "Action-Drama"
}, {
  "Name" : "GOT",
  "Type" : "Action-Drama"
}];



function mergeByProp (prop, xs) {
  return xs.reduce((acc, x) => {
    if (!acc[x[prop]]) {
      acc[x[prop]] = x;
    } else {
      acc[x[prop]] = Object.assign(acc[x[prop]], x);
    }
    return acc;
  }, {});
}

function objToArr (obj) {
  return Object.keys(obj).map(key => obj[key]);
}

console.info(objToArr(mergeByProp('Name', data)));

Другие вопросы по теме