web-dev-qa-db-fra.com

Tableau java Push uniquement si valeur non nulle

Je me demande si, et si, comment fonctionne ce qui suit:

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 suis en train de faire est de placer 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, c'est-à-dire indéfinie ou une chaîne. Maintenant, la question est: si je mets la poussée dans une fonction comme celle-ci:

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

Je peux toutefois m'assurer que le contenu de la clé n'est ajouté à l'élément que si le contenu (la fonction obtient en tant que paramètre) n'est pas nul. 

Bien sûr je peux modifier une 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 de savoir s’il est possible 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 sera inséré que si le contenu est défini, mais cela fonctionne-t-il, cela ne semble pas, mais peut-être y a-t-il une erreur dans mon code.

6
user5638730

Si l'objectif n'est pas simplement de raccourcir le code, le plus lisible serait quelque chose comme ceci: 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 un moyen ES6 de construire l'objet directement dans Array.Push et de filtrer ceux dont la valeur est null.

function Push(...arg) {
    array.Push(['number','value','context','content'].reduce((a,b,i)=> {
        if (arg[i] !== null) a[b]=arg[i]; return a;
    }, {}))
}
11
adeneo

Si vous êtes prêt à utiliser ES2015, vous pouvez le faire avec Object.assign:

array.Push(
  Object.assign(
    { number, value, context },
    content ? { content } : null
  )
);
6
Pavlo

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

const myPush = (number, value, context, content) =>
  array.Push({
    ...{ number, value, context },
    ...content && { content }
  });
2
dhilt

Cela peut être fait en étendant 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 originale dans Array car pense toujours aux autres programmeurs qui utilisent Array dans ce domaine projet particulier.

0
Maciej Sikora