2016-04-14 2 views
1

У меня есть следующая реализация.Как удалить пустой элемент в массиве javascript?

Array.prototype.abc = function(condition, t){ 
    var arr = []; 
    for(var i = 0; i < this.length; i++){ 
     arr.push(condition(this[i],t));   
    } 
    return arr; 
}; 

var a = [1,2,3,4]; 
var t = 2; 

alert(a.abc(function(item,diviser){ 
    if(item % diviser === 0) { return item; } 
},t)); 

Результат должен быть [2,4]. Вместо этого я получаю [,2,,4].

Я пробовал следующие условия, но всегда возвращает результат выше.

if(condition(this[i],t) !== false){ arr.push(condition(this[i],t)); } 

Это я делаю, когда я делаю

if(item % diviser === 0) { return item; } else { return false; } 

Состояние false оленья кожа работа для 'false' или true или 'true' или в этом отношении любого значения я возвращаюсь в остальное части. Однако в фактической реализации у меня нет части else. Я знаю, что мы можем использовать splice или что-то, чтобы удалить пустые разделы. Но я не понимаю, даже если я не верну ничего, кроме пустого в создании. И даже после использования, если условие до arr.push не работает. Что именно происходит и как удалить пробелы в массиве?

ответ

1

Вы должны проверить, является ли возвращенное значение undefined или не из вашего callBack,

for(var i = 0; i < this.length; i++){ 
    var x = condition(this[i],t); 
    if(typeof x !== "undefined") arr.push(x);   
} 

Вы сделали 2 разные попытки, чтобы исправить это, но это будет не потому, что,

  1. !== false , ваш callBack вернет либо число, либо неопределенное. Таким образом, строгое равенство будет терпеть неудачу все время и будет всегда проверено на false, поскольку типы операнда различны.

  2. if(item % diviser === 0) { return item; } else { return false; } Это вернет false, если условие не выполнено, и, следовательно, false будет перенесен в массив. И он не пропустит эту толкающую часть.

+0

Я пытался сравнить с '! == false', когда я возвращаю' else {return false; } '. Но это не работает. Почему это так? – Sp0T

+0

ОК. Благодарю. понял теперь. – Sp0T

+0

@ Sp0T Осторожно об этом фрагменте, 'condition (this [i], t) && arr.push (this [i]);' Это будет игнорировать '0', если он есть в вашем основном массиве. –

0

Переместить cmondition вне толчка и поместить его раньше. Условие должно возвращать только true или false.

condition(this[i],t) && arr.push(this[i]);   
0

Это потому, что вы делаете толкание независимо от того, что возвращается condition.

Заменить этот

arr.push(condition(this[i],t)); 

с

var val = condition(this[i],t) 
val = val !== false && arr.push(val); 

Поскольку ваш метод condition явно returing ложь, вы можете просто проверить val !== false

DEMO

Array.prototype.abc = function(condition, t){ 
 
    var arr = []; 
 
    for(var i = 0; i < this.length; i++){ 
 
     var val = condition(this[i],t); console.log(val); 
 
     val !== false && arr.push(val); 
 
    } 
 
    return arr; 
 
}; 
 

 
var a = [1,2,3,4]; 
 
var t = 2; 
 

 
document.body.innerHTML += a.abc(function(item,diviser){ 
 
    if(item % diviser === 0) { return item; } else { return false; } 
 
},t);

Смежные вопросы