Mise à jour si elle existe ou ajouter un nouvel élément à un tableau d'objets de manière élégante en javascript + lodash
J'ai donc un tableau d'objets comme ça:
var arr = [
{uid: 1, name: "bla", description: "cucu"},
{uid: 2, name: "smth else", description: "cucarecu"},
]
uid
est l'identifiant unique de l'objet dans ce tableau. Je suis à la recherche de la manière élégante de modifier l'objet, si nous avons l'objet de la uid,
ou ajouter un nouvel élément, si l'présenté uid
n'existe pas dans le tableau. J'imagine que la fonction à se comporter comme ça en js console:
> addOrReplace(arr, {uid: 1, name: 'changed name', description: "changed description"})
> arr
[
{uid: 1, name: "bla", description: "cucu"},
{uid: 2, name: "smth else", description: "cucarecu"},
]
> addOrReplace(arr, {uid: 3, name: 'new element name name', description: "cocoroco"})
> arr
[
{uid: 1, name: "bla", description: "cucu"},
{uid: 2, name: "smth else", description: "cucarecu"},
{uid: 3, name: 'new element name name', description: "cocoroco"}
]
Ma façon actuelle ne semble pas être très élégant et fonctionnel:
function addOrReplace (arr, object) {
var index = _.findIndex(arr, {'uid' : object.uid});
if (-1 === index) {
arr.push(object);
} else {
arr[index] = object;
}
}
Je suis en utilisant lodash, donc je pensais à quelque chose comme modifié _.union
personnalisé pour le contrôle d'égalité.
OriginalL'auteur ganqqwerty | 2014-09-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un objet au lieu d'un tableau:
Les clés sont les uides. Maintenant, votre fonction
addOrReplace
est simple comme ceci:Mise à JOUR
Il est également possible de utiliser un objet comme un indice en plus de la matrice.
De cette façon, vous avez rapide des recherches et aussi un tableau:
Prendre un coup d'oeil à la jsfiddle-démo (un objet-orienté solution vous trouverez ici)
Vous pouvez utiliser cette structure comme un indice. De cette façon, vous avez rapidement des recherches et une autre matrice pour des choses comme un tableau est nécessaire.
OriginalL'auteur friedi
Vieux post, mais pourquoi ne pas utiliser la fonction de filtre?
Ici est un jsfiddle montrant comment il fonctionne.
OriginalL'auteur Chris Sullivan
Dans votre première approche, pas besoin de Lodash grâce à
findIndex()
:Exemple:
(1) autres noms possibles:
addOrUpdate()
,upsert()
,appendOrUpdate()
,insertOrUpdate()
...(2) Peut également être fait avec
array.splice(i, 1, item)
Noter que cette démarche est "mutable" (vs "immuable"): au lieu de retourner un nouveau tableau (sans toucher le tableau d'origine), il modifie directement le tableau d'origine. La plupart du temps, c'est ce que vous voulez.
OriginalL'auteur tanguy_k
Peut-être
et
OriginalL'auteur Tomalak
Qu'en ayant les indices de la matrice de même que la
uid
?, comme:de cette façon, vous pouvez simplement utiliser
arr[2134], arr[2135]
, lors de l'arr[0] n'existe pas.donc, place du classique tableau associatif l'utilisation d'un (objet), de cette façon, vous pouvez utiliser non entier index et ne pas avoir de "trous" dans votre tableau
OriginalL'auteur Drecker