Je me demande si et comment fonctionne la chose suivante:

J'ai un tableau défini comme suit:

var array = [
  {number: '1', value: 'one', context: 'someContext'}, 
  {number: '2', value: 'two', context: 'anotherContext'},
  ...
]

Ce que je fais actuellement, c'est pousser les éléments dans le tableau, donc array.push({number: '1', value: 'one', context: 'someContext'}); et ainsi de suite, avec chaque élément du tableau.

Maintenant, cette chose est étendue: disons qu'il y a une autre clé appelée «contenu». Cette clé a une valeur appropriée, soit indéfinie, soit une chaîne. Maintenant, la question est: si je mets le push dans une fonction comme celle-ci:

push(number, value, context, content) {
    array.push({
       number: number,
       value: value,
       context: context,
       content: content
    })
}

Y a-t-il de toute façon, je peux m'assurer, que le contenu de la clé n'est ajouté à l'élément, que si le contenu (la fonction obtient comme paramètre) n'est pas nul.

Bien sûr, je peux modifier la fonction comme ça:

push(number, value, context, content) {
    if(!content) {
        array.push({
           number: number,
           value: value,
           context: context,
           content: content
       })
    } else {
        array.push({
           number: number,
           value: value,
           context: context
        })
   }
}

Mais la question est, s'il y a de toute façon de le faire dans la fonction push. J'ai aussi pensé à quelque chose comme

array.push({
  number: number,
  value: value,
  context: context,
  content? content: content
})

Donc, il ne serait inséré que si le contenu est défini, mais cela fonctionne, il ne semblait pas, mais il y a peut-être une erreur dans mon code.

10
user5638730 8 août 2016 à 22:46

4 réponses

Meilleure réponse

Si l'objectif n'est pas seulement de raccourcir le code, le plus lisible serait quelque chose comme ceci, où vous créez l'objet, ajoutez la propriété s'il y a une valeur, puis poussez l'objet dans le tableau.

push(number, value, context, content) {

    var o = {
        number  : number,
        value   : value,
        context : context
    }

    if (content !== null) o.content = content;

    array.push(o);
);

Voici une façon ES6 de construire l'objet directement à l'intérieur de Array.push et de filtrer tout ce qui a null comme valeur.

function push(...arg) {
    array.push(['number','value','context','content'].reduce((a,b,i)=> {
        if (arg[i] !== null) a[b]=arg[i]; return a;
    }, {}))
}
13
Marcos Dimitrio 14 janv. 2019 à 14:07

Cela peut être fait en étendant le tableau:

//create Your own array object
myArray=function(){};
myArray.prototype=Object.create(Array.prototype);

//create method
myArray.prototype.pushDefined=function(obj){

  var newObj={};//create clean object 
  for (var key in obj){
  
    if (typeof obj[key]!='undefined' && obj[key]!=null){
      
      //this element is defined and is not null
      newObj[key]=obj[key];
      
    }
  }
  
  this.push(newObj);//push clean object without undefind properties

};

//tests
var arr=new myArray();
arr.pushDefined({ name:"John",surname:null});

console.log(arr[0]);

Ou ajoutez cette méthode au prototype Array:

Array.prototype.pushDefined=function(obj)... //this will be method in every array

Je ne recommanderais pas de changer la méthode push d'origine dans Array, car pensez toujours aux autres programmeurs qui utilisent Array dans ce projet particulier.

0
Maciej Sikora 8 août 2016 à 20:30

Avec Opérateur d'étalement pour les littéraux d'objet (ECMAScript 2018) ça a l'air super facile:

const myPush = (number, value, context, content) =>
  array.push({
    ...{ number, value, context },
    ...content && { content }
  });
3
dhilt 24 août 2018 à 00:56

Si vous êtes prêt à utiliser ES2015, cela peut être fait avec Object.assign:

array.push(
  Object.assign(
    { number, value, context },
    content ? { content } : null
  )
);
6
Pavlo 8 août 2016 à 19:52