我想知道以下事情是否有效:
我有一个如下定义的数组:
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
})
所以只有在定义了内容时才会插入它,但这样做有用,它看起来并不像,但可能是我的代码中的错误。
答案 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的程序员 特别项目。