J'ai ceci par exemple:

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

Et je veux changer chaque valeur 0 en null

const sample = [
  { id: 1, val1: null, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: null, val29: null },
  { id: 11, val1: null, any: null, sample: null, val29: 10 },
];

Je sais que je dois utiliser map mais j'ai des difficultés à accéder à chaque objet.

3
ajbee 16 sept. 2020 à 08:57

8 réponses

Meilleure réponse

Si vous n'avez aucune méthode, cela pourrait également fonctionner.

Vous le stringify et utilisez une fonction de remplacement pour remplacer tous les zéros par null. Ensuite, analysez-le simplement.

Mots également pour les objets profondément imbriqués

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

let str = JSON.stringify(sample,(k, v) =>  v === 0 ? null : v);
let result = JSON.parse(str);

console.log(result);
5
Ifaruki 16 sept. 2020 à 06:35

Vous avez besoin de forEach si vous ne voulez pas de nouvelle baie

const sample = [ { id: 1, val1: 0, val4: 10 }, { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 }, { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 }];

sample.forEach(item => { 
  for (val in item) item[val] = item[val] === 0 ? null : item[val] 
});
console.log(sample)
1
mplungjan 16 sept. 2020 à 06:42

Vous voudrez peut-être faire une boucle dans la liste, puis pour chaque propriété de l'objet que vous vérifiez pour val

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

let sample1 = sample[0]; //<<-- you may loop through your entire array

for (const [key, value] of Object.entries(sample1)) {
  if (key.lastIndexOf('val')>=0 && value === 0){
       sample1[key] = null;
   }
}

console.log(sample1)
0
Dalorzo 16 sept. 2020 à 06:03

Vous pouvez l'utiliser, mais vous avez besoin de let pour réutiliser le nom de la variable

let sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];
sample = sample.map(obj => {
  Object.keys(obj).forEach(key => {
    obj[key] = obj[key] || null;
  });
  return obj;
});

console.log(sample)

Il s'agit essentiellement d'obtenir les clés de chaque objet puis de vérifier la valeur de l'objet par rapport à cette clé dans obj[key] = obj[key] || null. Ainsi, lorsque obj[key] sera égal à 0, nul ou non défini, il deviendra égal à nul, sinon il ne sera pas mis à jour.

0
mplungjan 16 sept. 2020 à 06:08

C'est pour cela que Array.prototype.map a été fait, il prend une fonction comme paramètre, qui est appelée une fois pour chaque élément du tableau, tout en fournissant l'élément lui-même comme argument. La fonction.map renvoie un nouvel ensemble et ne modifie pas directement l'original. Quelle que soit la valeur de retour de la fonction de paramètre pour chaque élément, devient la nouvelle valeur de cet élément dans le tableau nouvellement construit.

Dans votre cas, c'est un peu plus compliqué puisque chaque élément lui-même est un objet, nous pouvons donc convertir chaque objet en un tableau, la carte est ses propres propriétés et renvoyer l'objet reconstruit à notre fonction principale de paramètre .maps

Donc..

sample=sample.map(function (currentElement){
    return (typeof(currentElement) == "object" ?
        Object.fromEntries(
            Object.entries(
                currentElement
            ).map(function (prop){
                return prop === 0 ? null : prop
            })
        ) : currentElement
    )
})
0
bluejayke 16 sept. 2020 à 06:14

J'ai une solution utilisant uniquement la carte, cela peut aider:

var sample = [
    { id: 1, val1: 0, val4: 10 },
    { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
    { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
  ]; 
var output = sample.map((item) => {
      Object.keys(item).map((key) => {
        item[key] = (item[key] == 0 ? null : item[key]); return item[key]
      });
      return item;
  });
  
  console.log(output);
0
Piyush 16 sept. 2020 à 06:18

Vous pouvez utiliser "for ... in" pour accéder à tous les objets

Démo ici

const sample = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 },
];

sample.map((s) => {
  for (let i in s) if (s[i] === 0) s[i] = null;
  return s;
});
console.log(sample);
0
mplungjan 16 sept. 2020 à 06:35

Style immuable

const sample: Record<string, unknown>[] = [
  { id: 1, val1: 0, val4: 10 },
  { id: 10, val1: 1, val4: 10, val19: 0, val29: 0 },
  { id: 11, val1: 0, val4: 0, val19: 0, val29: 10 }
]

const updated = sample.map((rec) =>
  Object.keys(rec).reduce<Record<string, unknown>>(
    (acc, key) => (rec[key] == 0 ? { ...acc, [key]: null } : { ...acc, [key]: rec[key] }),
    {}
  )
)

console.log(updated)
// OUTPUT
// [
//   { id: 1, val1: null, val4: 10 },
//   { id: 10, val1: 1, val4: 10, val19: null, val29: null },
//   { id: 11, val1: null, val4: null, val19: null, val29: 10 }
// ]
0
Pritam Kadam 16 sept. 2020 à 06:51