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