Объединить 2 jsons по элементу, используя javascript

У меня есть этот результат json:

[
  {
    "nom_playlist": "bbbb",
    "countMedias": 2
  },
  {
    "nom_playlist": "ccc",
    "countMedias": 1
  },
  {
    "nom_playlist": "aaaa",
    "countMedias": 3
  },
  {
    "nom_playlist": "xxxx",
    "countMedias": 1
  },
  {
    "nom_playlist": "resttttttttt",
    "countMedias": 2
  }
]

У меня есть другой json:

[ 
  {
    idPlayListe: 25,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 1,
    nomPlaylist: 'bbbb' 
  },
  { 
    idPlayListe: 32,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 0,
    nomPlaylist: 'ccc' 
   } 
]

Я хочу добавить etat второго json к первому json и присоединиться к нему с помощью nomPlaylist, а если nomPlaylist не существует, я хочу установить etat по умолчанию на 0.

Это пример того, как я хочу, чтобы результаты были:

[
  {
    nom_playlist: 'bbbb',
    etat: 1,
    countMedias: 2
  },
  {
    nom_playlist: 'ccc',
    etat: 0,
    countMedias: 1
  },
  {
    nom_playlist: 'aaaa',
    etat: 0,
    countMedias: 3
  },
  {
    nom_playlist: 'xxxx',
    etat: 0,
    countMedias: 1
  },
  {
    nom_playlist: 'resttttttttt',
    etat: 0,
    countMedias: 2
  }
]

Любая помощь будет оценена по достоинству. Спасибо

Можете ли вы рассказать нам, что вы пробовали

jonatjano 29.07.2019 11:52

Самым простым способом было бы изменить любой запрос БД, который генерирует JSON в первую очередь.

Mike Brockington 29.07.2019 12:00
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
62
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы пробовали такой подход? Конечно, это требует некоторой проверки ошибок и запасных вариантов.

const firstJson = ...;
const secondJson = ...;

const firstObject = JSON.parse(firstJson);
const secondObject = JSON.parse(secondJson);

const etatDict = secondObject.reduce((acc, cur) => acc[cur.nomPlaylist] = cur.etat, {});

for (const playlist of firstObject) {
    playlist.etat = etatDict[playlist.nom_playlist];
}

Ответ принят как подходящий

Есть несколько способов сделать это, вы можете перебрать первый массив, а затем перебрать второй и переназначить etat, если nomPlaylist то же самое (извините за имя переменной, я не знаю, что эти данные должны представлять):

const data = [
  { "nom_playlist": "bbbb", "countMedias": 2 },
  { "nom_playlist": "ccc", "countMedias": 1 },
  { "nom_playlist": "aaaa", "countMedias": 3 },
]
const otherData = [ 
  { etat: 1, nomPlaylist: 'bbbb' },
  { etat: 0, nomPlaylist: 'ccc' }
]

for ( const foo of data ) {
  let etat = 0;
  for ( const bar of otherData ) {
    if ( foo.nom_playlist === bar.nomPlaylist ) {
      etat = bar.etat;
      break;
    }
  }
  foo.etat = etat;
}
console.info( data );

Это хорошо, хотя он излишне зацикливается на otherData каждый раз, когда данные зацикливаются. В зависимости от размера других данных это может резко снизить производительность. Лучше один раз зациклиться на otherData и кэшировать dict с нужными вам данными.

Eltu 29.07.2019 12:12

Вы можете попробовать с map() и filter()

var arr1 = [{"nom_playlist": "bbbb","countMedias": 2},
            {"nom_playlist": "ccc","countMedias": 1},
            {"nom_playlist": "aaaa","countMedias": 3},
            {"nom_playlist": "xxxx","countMedias": 1},
            {"nom_playlist": "resttttttttt","countMedias": 2}];

var arr2 = [ {
    idPlayListe: 25,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 1,
    nomPlaylist: 'bbbb' 
  },{ 
    idPlayListe: 32,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 0,
    nomPlaylist: 'ccc' 
   } 
];
var res = arr1.map(i => {
  var etat = arr2.filter(j => j.nomPlaylist == i.nom_playlist);
  i.etat = etat.length > 0 ?  etat[0].etat : 0;
  return i;
});

console.info(res);

Использование цикла map и forEach

var a=[
  {
    "nom_playlist": "bbbb",
    "countMedias": 2
  },
  {
    "nom_playlist": "ccc",
    "countMedias": 1
  },
  {
    "nom_playlist": "aaaa",
    "countMedias": 3
  },
  {
    "nom_playlist": "xxxx",
    "countMedias": 1
  },
  {
    "nom_playlist": "resttttttttt",
    "countMedias": 2
  }
]


var b=[ 
  {
    idPlayListe: 25,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 1,
    nomPlaylist: 'bbbb' 
  },
  { 
    idPlayListe: 32,
    idUtilisateur: 11968,
    idMedia: 79,
    etat: 0,
    nomPlaylist: 'ccc' 
   } 
]
console.info(a.map(function(e){
b.forEach(function(k){
k.nomPlaylist==e.nom_playlist?e.etat=k.etat:false
})
if (!e.hasOwnProperty('etat'))
e.etat=0;
return e;
}))
  • Создайте карту первого массива объектов, используя .reduce().
  • Используйте .map() для итерации по первому массиву и создайте новый объект, используя Object.assign(), используя объект карты (созданный выше), чтобы получить значение etat из второго массива или установить его по умолчанию на 0.

const data1 = [
  {"nom_playlist": "bbbb", "countMedias": 2},
  {"nom_playlist": "ccc", "countMedias": 1},
  {"nom_playlist": "aaaa", "countMedias": 3},
  {"nom_playlist": "xxxx", "countMedias": 1},
  {"nom_playlist": "resttttttttt", "countMedias": 2}
];

const data2 = [ 
  {idPlayListe: 25, idUtilisateur: 11968, idMedia: 79, etat: 1, nomPlaylist: 'bbbb'},
  {idPlayListe: 32, idUtilisateur: 11968, idMedia: 79, etat: 0, nomPlaylist: 'ccc'} 
];

const map = data2.reduce((r, c) => (r[c.nomPlaylist] = c, r), {});

const result = data1.map(
  o => Object.assign(
    {}, o, {etat: o.nom_playlist in map ? map[o.nom_playlist].etat : 0}
  )
);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

    // first array of objects  
    var firstJson = [
            {
              "nom_playlist": "bbbb",
              "countMedias": 2
            },
            {
              "nom_playlist": "ccc",
              "countMedias": 1
            },
            {
              "nom_playlist": "aaaa",
              "countMedias": 3
            },
            {
              "nom_playlist": "xxxx",
              "countMedias": 1
            },
            {
              "nom_playlist": "resttttttttt",
              "countMedias": 2
            }
        ];
          
        // second array of objects 
        var secondJson = [
            {
              nom_playlist: 'bbbb',
              etat: 1,
              countMedias: 2
            },
            {
              nom_playlist: 'ccc',
              etat: 0,
              countMedias: 1
            },
            {
              nom_playlist: 'aaaa',
              etat: 0,
              countMedias: 3
            },
            {
              nom_playlist: 'xxxx',
              etat: 0,
              countMedias: 1
            },
            {
              nom_playlist: 'resttttttttt',
              etat: 0,
              countMedias: 2
            }
        ];
       // Generating updated array using firstJson and secondJson arryas
       
        var mergedJson = firstJson.map(item => {    
            secondJson.forEach(obj => {
                if (item.nom_playlist === obj.nomPlaylist) {
                    item["etat"] = obj.etat;
                }                
            });
            if (!item["etat"]) {
                item["etat"] = 0;
            }
            return item;
        });
        console.info(mergedJson);

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