J'ai une entrée JSON qui peut aller à n'importe quel nombre de niveaux. Je veux ajouter le seul attribut à tous les niveaux

[{
  title:' ' ,
  id : ' ',
  description: ' ',
  date :' ',
  children:[{
     children : [{ 
     ....
      }]
    title:' ' ,
    id : ' ',
    description: ' ',
    date :' ',  
   }]
  },
  title:' ' ,
  id : ' ',
  description: ' ',
  date :' ',
  children:[{
    children : [{ 
     ....
    }]
   ...
    }]
  }]

Je souhaite ajouter un attribut isShow à chaque niveau. Comment accéder aux niveaux internes de JSON ?

1
ramya krishna 8 mars 2019 à 12:06

2 réponses

Meilleure réponse

Si vous souhaitez ajouter une propriété isShown à chaque élément et à chacun de ses enfants de manière récursive, voici un moyen de le faire.

Cette solution utilise Array.isArray(x) pour vérifier si x est un tableau et x instanceof Object pour vérifier si x est un objet. Si x est un tableau forEach() est utilisé pour appliquer la fonction à chaque entrée, si x est un objet, la propriété est ajoutée et forEach est utilisé pour appliquer la fonction à chaque enfant.

const data = [{
  title: '',
  id: '',
  description: '',
  date: '',
  children: [{
    children: [{}],
    title: '',
    id: '',
    description: '',
    date: '',  
  }]
}, {
  title: '',
  id: '',
  description: '',
  date: '',
  children: [{ children: [{}] }]
}];

function addIsShown(x) {
  if (Array.isArray(x)) { // if data is an array
    x.forEach(addIsShown); // call the function on each item
  } else if (x instanceof Object) { // otherwise, if data is an object
    x.isShown = true; // add prop to object
    (x.children || []).forEach(addIsShown); // and call function on each child
  }
}

addIsShown(data);

console.log(data)
2
jo_va 8 mars 2019 à 09:51

Cela ressemble à un travail pour une fonction de réanimation...

// https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
nTypeof = function (obj) {
  return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
};
var input = `[{
  "title":" " ,
  "id" : " ",
  "description": " ",
  "date" :" ",
  "children":[{
  "title":" " ,
  "id" : " ",
  "description": " ",
  "date" :" "
  }]
  }]`
  var output = JSON.parse(input,
    // reviver function called for each node in the JSON
    (key,value)=>{
      if(nTypeof(value) === "object")
        value.isShown = 0
      return value
    })
  console.log(output)
0
bbsimonbb 8 mars 2019 à 10:32