仅当值不为空时才推送Javascript数组

时间:2016-08-08 19:46:19

标签: javascript arrays if-statement

我想知道以下事情是否有效:

我有一个如下定义的数组:

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

我目前正在做的是将元素推送到数组中,所以array.push({number: '1', value: 'one', context: 'someContext'});等等,每个数组元素。

现在这个问题已经扩展:请说出另一个名为“内容”的密钥。此键具有适当的值,可以是undefined或字符串。现在的问题是:如果我推动这样的函数:

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

所以只有在定义了内容时才会插入它,但这样做有用,它看起来并不像,但可能是我的代码中的错误。

4 个答案:

答案 0 :(得分:11)

如果目标不仅仅是使代码更短,那么最可读的就是这样,你创建对象,如果有值就添加属性,然后将对象推送到数组。

push(number, value, context, content) {

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

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

    array.push(o);
);

这是一种直接在Array.push内构建对象的ES6方法,并过滤任何以null作为值的对象。

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

答案 1 :(得分:6)

如果您愿意使用ES2015,可以使用Object.assign

完成此操作
array.push(
  Object.assign(
    { number, value, context },
    content ? { content } : null
  )
);

答案 2 :(得分:2)

使用Spread operator作为对象文字(ECMAScript 2018),看起来超级简单:

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

答案 3 :(得分:0)

可以通过扩展数组来完成:

//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原型:

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

我不建议更改Array中的原始push方法,因为   总是想想其他正在使用Array的程序员   特别项目。