У меня есть этот результат 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
}
]
Любая помощь будет оценена по достоинству. Спасибо
Самым простым способом было бы изменить любой запрос БД, который генерирует JSON в первую очередь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пробовали такой подход? Конечно, это требует некоторой проверки ошибок и запасных вариантов.
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 с нужными вам данными.
Вы можете попробовать с 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);
Можете ли вы рассказать нам, что вы пробовали