it-swarm.com.de

Javascript-Array Nur drücken, wenn Wert nicht Null ist

Ich frage mich, ob und wie das Folgende funktioniert:

Ich habe ein Array wie folgt definiert:

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

Was ich gerade mache, ist das Verschieben der Elemente in das Array, also array.Push({number: '1', value: 'one', context: 'someContext'}); und so weiter, mit jedem Array-Element. 

Nun ist diese Sache erweitert: Nehmen wir an, es gibt einen weiteren Schlüssel namens 'content'. Dieser Schlüssel hat einen geeigneten Wert, der entweder nicht definiert oder eine Zeichenfolge ist. Nun ist die Frage: Wenn ich das Pushing in eine Funktion wie diese stecke:

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

Gibt es sowieso kann ich sicherstellen, dass der Schlüsselinhalt nur zum Element hinzugefügt wird, wenn der Inhalt (die Funktion als Parameter erhält) nicht null ist. 

Natürlich kann ich die Funktion so ändern:

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
        })
   }
}

Aber die Frage ist, ob dies in der Push-Funktion trotzdem möglich ist. Ich dachte auch über so etwas nach

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

Es würde also nur eingefügt werden, wenn Inhalt definiert wurde, aber dies funktioniert nicht so, aber vielleicht liegt ein Fehler in meinem Code vor.

6
user5638730

Wenn das Ziel nicht nur die Verkürzung von Code ist, wäre dies am besten lesbar, wenn Sie das Objekt erstellen, die Eigenschaft hinzufügen, wenn ein Wert vorhanden ist, und dann das Objekt in das Array verschieben.

Push(number, value, context, content) {

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

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

    array.Push(o);
);

Hier ist eine ES6-Methode, um das Objekt direkt in Array.Push zu erstellen und alle zu filtern, die null als Wert haben.

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

Wenn Sie offen für die Verwendung von ES2015 sind, können Sie dies mit Object.assign tun:

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

Mit Spread Operator für Objektliterale (ECMAScript 2018) sieht es super einfach aus:

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

Dies kann durch Erweitern des Arrays erfolgen:

//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]);

Oder fügen Sie diese Methode zu Array-Prototypen hinzu:

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

Ich würde nicht empfehlen, die ursprüngliche Push-Methode in Array zu ändern, weil Denken Sie immer an andere Programmierer, die Array in dieser .__ verwenden. bestimmtes Projekt.

0
Maciej Sikora