2016-05-24 8 views
-2

Ich brauche Hilfe zwei Objekte in AngularJS verschmelzenden :)Wie verschmelzen diese beiden Objekte in Angular JS?

ich das trakt.tv API (http://docs.trakt.apiary.io/) unter Verwendung von in der Geschichte Daten zu ziehen. Dies gibt eine Liste der Filme und Episoden zurück, die der Benutzer angesehen hat (siehe: http://docs.trakt.apiary.io/#reference/sync/get-history)

Wie Sie sehen können, hält es die Nutzerbewertung für einen bestimmten Film oder eine Episode nicht ein. Aber es gibt einen Weg, um alle Nutzer Bewertungen für Filme und TV-Shows ect zu bekommen .. (siehe http://docs.trakt.apiary.io/#reference/sync/get-ratings)

Also, was ich mit dem Film/Folge in der die Nutzer Film/episode ratings tun möchten, ist passen Geschichtsliste, aber ich kann einfach nicht meinen Kopf darüber wickeln, wie es gemacht werden sollte.

Beispiel "History" Objekt:

[ 
    { 
    "id": 2008588422, 
    "watched_at": "2016-05-17T10:36:12.000Z", 
    "action": "watch", 
    "type": "movie", 
    "movie": { 
     "title": "Batman v Superman: Dawn of Justice", 
     "year": 2016, 
     "ids": { 
     "trakt": 129583, 
     "slug": "batman-v-superman-dawn-of-justice-2016", 
     "imdb": "tt2975590", 
     "tmdb": 209112 
     } 
    } 
    }, 
    { 
    "id": 1995814508, 
    "watched_at": "2016-05-09T22:39:47.000Z", 
    "action": "checkin", 
    "type": "movie", 
    "movie": { 
     "title": "Dirty Grandpa", 
     "year": 2016, 
     "ids": { 
     "trakt": 188691, 
     "slug": "dirty-grandpa-2016", 
     "imdb": "tt1860213", 
     "tmdb": 291870 
     } 
    } 
    }, 
    { 
    "id": 2005359787, 
    "watched_at": "2016-05-09T01:00:00.000Z", 
    "action": "watch", 
    "type": "episode", 
    "episode": { 
     "season": 6, 
     "number": 3, 
     "title": "Oathbreaker", 
     "ids": { 
     "trakt": 1989021, 
     "tvdb": 5579003, 
     "imdb": "tt4131606", 
     "tmdb": 1186952, 
     "tvrage": 1065908650 
     } 
    }, 
    "show": { 
     "title": "Game of Thrones", 
     "year": 2011, 
     "ids": { 
     "trakt": 1390, 
     "slug": "game-of-thrones", 
     "tvdb": 121361, 
     "imdb": "tt0944947", 
     "tmdb": 1399, 
     "tvrage": 24493 
     } 
    } 
    } 
] 

Beispiel "Kindersicherung" Objekt:

[ 
    { 
    "rated_at": "2016-05-17T10:36:28.000Z", 
    "rating": 7, 
    "type": "movie", 
    "movie": { 
     "title": "Batman v Superman: Dawn of Justice", 
     "year": 2016, 
     "ids": { 
     "trakt": 129583, 
     "slug": "batman-v-superman-dawn-of-justice-2016", 
     "imdb": "tt2975590", 
     "tmdb": 209112 
     } 
    } 
    }, 
    { 
    "rated_at": "2016-04-05T15:55:36.000Z", 
    "rating": 8, 
    "type": "movie", 
    "movie": { 
     "title": "You Don't Mess With the Zohan", 
     "year": 2008, 
     "ids": { 
     "trakt": 5835, 
     "slug": "you-don-t-mess-with-the-zohan-2008", 
     "imdb": "tt0960144", 
     "tmdb": 10661 
     } 
    } 
    }, 
    { 
    "rated_at": "2016-05-24T16:19:54.000Z", 
    "rating": 8, 
    "type": "episode", 
    "episode": { 
     "season": 6, 
     "number": 3, 
     "title": "Oathbreaker", 
     "ids": { 
     "trakt": 1989021, 
     "tvdb": 5579003, 
     "imdb": "tt4131606", 
     "tmdb": 1186952, 
     "tvrage": 1065908650 
     } 
    }, 
    "show": { 
     "title": "Game of Thrones", 
     "year": 2011, 
     "ids": { 
     "trakt": 1390, 
     "slug": "game-of-thrones", 
     "tvdb": 121361, 
     "imdb": "tt0944947", 
     "tmdb": 1399, 
     "tvrage": 24493 
     } 
    } 
    } 
] 

Gewünschtes Ergebnis:

[ 
    { 
    "id": 2008588422, 
    "rated_at": "2016-05-17T10:36:28.000Z", 
    "rating": 7, 
    "watched_at": "2016-05-17T10:36:12.000Z", 
    "action": "watch", 
    "type": "movie", 
    "movie": { 
     "title": "Batman v Superman: Dawn of Justice", 
     "year": 2016, 
     "ids": { 
     "trakt": 129583, 
     "slug": "batman-v-superman-dawn-of-justice-2016", 
     "imdb": "tt2975590", 
     "tmdb": 209112 
     } 
    } 
    }, 
    { 
    "id": 1995814508, 
    "watched_at": "2016-05-09T22:39:47.000Z", 
    "action": "checkin", 
    "type": "movie", 
    "movie": { 
     "title": "Dirty Grandpa", 
     "year": 2016, 
     "ids": { 
     "trakt": 188691, 
     "slug": "dirty-grandpa-2016", 
     "imdb": "tt1860213", 
     "tmdb": 291870 
     } 
    } 
    }, 
    { 
    "id": 2005359787, 
    "rated_at": "2016-05-24T16:19:54.000Z", 
    "rating": 8, 
    "watched_at": "2016-05-09T01:00:00.000Z", 
    "action": "watch", 
    "type": "episode", 
    "episode": { 
     "season": 6, 
     "number": 3, 
     "title": "Oathbreaker", 
     "ids": { 
     "trakt": 1989021, 
     "tvdb": 5579003, 
     "imdb": "tt4131606", 
     "tmdb": 1186952, 
     "tvrage": 1065908650 
     } 
    }, 
    "show": { 
     "title": "Game of Thrones", 
     "year": 2011, 
     "ids": { 
     "trakt": 1390, 
     "slug": "game-of-thrones", 
     "tvdb": 121361, 
     "imdb": "tt0944947", 
     "tmdb": 1399, 
     "tvrage": 24493 
     } 
    } 
    } 
] 

Grundsätzlich Bemessungsdaten sollten mit den entsprechenden Filmen hinzugefügt werden und Episoden innerhalb des Historienobjekts.

Ein angular.merge oder .extend gibt nicht das gewünschte Ergebnis, und diese scheinen sehr einfach an der Dokumentation (https://docs.angularjs.org/api/ng/function/angular.merge)

Alle Hilfe Willkommen Suche zu sein! :)

Dank

+0

was gibt Ihnen angular.merge? Würde eckig.weitermachen die Arbeit machen? – bmartin

+0

Hallo @bmartin angular.merge gibt zurück: http://pastebin.com/jkaDnfGS und angular.extend gibt: http://pastebin.com/K3pZ9RJd beide nicht das gewünschte Ergebnis :( – webslash

+0

eckig.Merge sieht für mich korrekt aus? – bmartin

Antwort

1

Nach Kommentar des op wo ES6 ist keine Option ive eine ES5 gleichwertig mit einer find Hilfsmethode erstellt ES6 des Fund zu imitieren.

var merged = history.map(function (h) { 
    var x = find(ratings, function (r) { 
    return comparator(h, r); 
    }); 

    return x ? angular.merge(h, x) : h; 
}); 

/* 
    Utility fn to get array.find style behaviour 
*/ 
function find(arr, fn) { 
    if (!Array.isArray(arr)) 
    return undefined; 

    for(var i = 0; i < arr.length; i++){ 
    if (fn(arr[i])) 
     return arr[i]; 
    } 
} 

fiddle


In meinem Kommentar sagte, dass ich Sie ES5 die verwenden könnte array.some jedoch, log ich. some wird True zurückgeben, sollte ein einzelnes Match Ihre Kriterien erfüllen (gut für Filter), aber wir wollen das tatsächliche Objekt.

Glücklicherweise speichert ES6 uns wieder mit find; (Sie könnten Filter in ES5 verwenden, aber das gibt uns ein Array zurück)

Also damit sollte so etwas ganz einfach sein.

Wie immer ist dies ES6, also könnte IE auch nicht auftauchen. Sie können Ihren ES6 durch Dinge wie babel laufen lassen, um in ES5 zu verwandeln, oder tun Sie das ganze oben mit verschiedenen for loops.

Fiddle

+0

Hallo @ ste2425, danke für diese detaillierte Antwort! Das macht fast das, was ich erreichen möchte. Im Endergebnis sollte das Objekt die History-Daten mit den Rating-Daten haben, die den Items hinzugefügt werden, wenn sie verfügbar sind. Wie Sie festgestellt haben, enthält Ihr Ergebnis auch einen Film, der nur bewertet wurde. Aber sollte nicht im Ergebnis angezeigt werden, weil es nicht in der Benutzerhistorie ist. Auch https://kangax.github.io/compat-table/es6/ zeigt mir ES6 wird nicht auf mobilen Geräten (Android) unterstützt. Ich erstelle eine ionische (http://ionicframework.com/) mobile App, das ist ein Problem. – webslash

+0

Ahh, also willst du umdrehen, also ist Geschichte der Meister und hat Bewertungsinfo sollte es verfügbar sein. Das ist ziemlich einfach. Ich empfehle dringend, den ES6-konformen Code zu implementieren und ein Tool wie babel zu verwenden, um es in ES5 zu konvertieren. Dann, sobald Browser aufholen, einfach die Umwandlung umdrehen. Ich werde die Antwort bearbeiten. – ste2425

+0

Ja das ist richtig! Ok, freue mich auf deine aktualisierte Antwort :) – webslash