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