J'ai un tableau comme ci-dessous
[{ "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" }, { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" } ]
Je veux créer un nouveau tableau basé sur le tableau ci-dessus, mais avec seulement le dernier élément, (grouper par nom de l'élément). p >
[{ "id": "001", "name": "A", "timestamp_created": "2019-02-27T11:22:19" }, { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" }, { "id": "003", "name": "B", "timestamp_created": "2019-02-27T10:15:19" }, { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" } ]
Comment combiner les différentes fonctionnalités de Lodash pour obtenir le résultat?
Toute suggestion, aidez-moi s'il vous plaît.
5 Réponses :
Vous pouvez prendre Map code>
, collectez tous les derniers éléments (en vérifiant timestamp_created
), regroupés par nom
et récupérez les valeurs.
.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ id: "002", name: "A", timestamp_created: "2019-02-27T11:30:19" }, { id: "003", name: "B", timestamp_created: "2019-02-27T10:15:19" }, { id: "004", name: "B", timestamp_created: "2019-02-27T11:05:19" }, { id: "001", name: "A", timestamp_created: "2019-02-27T11:22:19" }], result = Array.from(data .reduce( (m, o) => m.has(o.name) && m.get(o.name).timestamp_created > o.timestamp_created ? m : m.set(o.name, o), new Map ) .values() ); console.log(result);
la quantité d'effort de sauvegarde de personnage cependant: D
Je l'appelle le facteur Nina;)
Sans utiliser la bibliothèque lodash
, vous pouvez générer le résultat en utilisant Array.reduce () :
.as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;}
const input = [ { "id": "001", "name": "A", "timestamp_created": "2019-02-27T11:22:19" }, { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" }, { "id": "003", "name": "B", "timestamp_created": "2019-02-27T10:15:19" }, { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" } ]; let res = input.reduce((acc, {id, name, timestamp_created}) => { acc[name] = acc[name] || {id, name, timestamp_created}; if (acc[name].timestamp_created < timestamp_created) acc[name] = {id, name, timestamp_created}; return acc; }, {}); console.log(Object.values(res));
Si vous souhaitez utiliser lodash, cela fera l'affaire.
function latestItems(original) { filtered = []; grouped = _.groupBy(original, "name"); _.forEach(grouped, function (group) { newest = { "timestamp_created": "0" }; _.forEach(group, function (item) { if (item.timestamp_created > newest.timestamp_created) { newest = item; } }); filtered.push(newest); }); return filtered; }
Pour répondre à la question, ceux-ci ont besoin de codes et de scripts, une description du fonctionnement du code écrit doit être utile.
Excellentes réponses jusqu'à présent. Comme OP a demandé une solution Lodash, voici que:
const data = [{ "id": "001", "name": "A", "timestamp_created": "2019-02-27T11:22:19" }, { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" }, { "id": "003", "name": "B", "timestamp_created": "2019-02-27T10:15:19" }, { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" } ]; const reduceFunction = (acc, val) => { if (val.name in acc) { if (val.timestamp_created > acc[val.name].timestamp_created) { acc[val.name] = val } } else { acc[val.name] = val } return acc; }; const filteredData = _.values( _.reduce(data, reduceFunction, {}) );
Solution courte utilisant lodash
const data = [...] const result = _(data) .groupBy('name') .map(group => _.maxBy(group, 'timestamp_created')) .value()
Utilisez groupBy
pour regrouper par nom . Ensuite, utilisez maxBy
pour obtenir un objet qui a max timestamp_created.
_.maxBy (tableau, [iteratee = _. identity])
Cette méthode est similaire à _.max sauf qu'elle accepte iteratee qui est invoquée pour chaque élément du tableau pour générer le critère selon lequel la valeur est classée. L'itération est appelée avec un argument: (valeur).
Les deux derniers articles? Dernier élément de chaque nom Quoi?
Par exemple, le tableau a 2 éléments (A, B) mais un horodatage différent créé, je veux créer un nouveau tableau avec le dernier A et le dernier B, en fonction de l'horodatage