JavaScript массив push только если значение не 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
        })
   }
}

но вопрос в том, есть ли в любом случае это сделать в функции push. Я также думал о чем-то вроде

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

поэтому он будет вставлен только в том случае, если контент определен, но работает ли это, это не похоже на, но, возможно, в моем коде ошибка.

4 ответов


если объект не просто сделать код короче, наиболее читаемым будет что-то вроде этого, где вы создаете объект, добавляете свойство, если есть значение, а затем нажимаете объект в массив.

push(number, value, context, content) {

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

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

    array.push(o);
);

вот способ ES6 построить объект непосредственно внутри Array.push, и фильтровать все, что имеет null как ценность.

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

Если вы открыты для использования ES2015, это можно сделать с помощью Object.assign:

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

Это можно сделать, расширив массив:

//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

Я бы не рекомендовал изменять исходный метод push в массиве, потому что всегда думайте о других программистах, которые используют Array в этом конкретный проект.


С распространение оператор для объектных литералов (ECMAScript 2018) это выглядит очень просто:

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