web-dev-qa-db-ja.com

JavaScript配列は値がnullでない場合にのみプッシュします

次のことがどのように機能しているのか、そしてどのように機能しているのか疑問に思っています:

私は次のように定義された配列を持っています:

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

私が現在していることは、要素を配列にプッシュすることです。したがって、配列要素ごとにarray.Push({number: '1', value: 'one', context: 'someContext'});などが続きます。

これが拡張されました。「コンテンツ」と呼ばれる別のキーがあるとします。このキーには、未定義または文字列の適切な値があります。質問は次のとおりです。プッシュを次のような関数に入れた場合:

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

とにかく、コンテンツ(関数がパラメーターとして取得する)がnullでない場合、キーコンテンツは要素にのみ追加されることを確認できます。

もちろん、私はそのような関数を変更できます:

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

しかし、問題は、プッシュ機能でこれを行う方法があるかどうかです。私も何か考えました

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

したがって、コンテンツが定義されている場合にのみ挿入されますが、これは機能しますが、そうではありませんでしたが、私のコードに間違いがあるかもしれません。

8
user5638730

コードを短くするだけではない場合、最も読みやすいのは次のようなものです。オブジェクトを作成し、値がある場合はプロパティを追加してから、オブジェクトを配列にプッシュします。

Push(number, value, context, content) {

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

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

    array.Push(o);
);

Array.Pushの内部にオブジェクトを直接構築し、値としてnullを持つものをフィルタリングするES6の方法を次に示します。

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

ES2015を使用する場合は、Object.assign

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

スプレッド演算子 でオブジェクトリテラル(ECMAScript 2018)を使用すると、非常に簡単に見えます。

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

配列を拡張することで実行できます:

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

または、このメソッドを配列プロトタイプに追加します。

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

この特定のプロジェクトでArrayを使用している他のプログラマーについて常に考えているため、Arrayの元のPushメソッドを変更することはお勧めしません。

0
Maciej Sikora