удалить данный элемент в массиве с помощью расширения jquery fn не работает ссылочным способом - PullRequest
0 голосов
/ 05 февраля 2012

я написал скрипт расширения jnery custom fn для удаления заданного элемента в массиве, но это работает неожиданным образом, поэтому я хочу выяснить, как заставить это делать ссылочные манипуляции без использования обратного ссылочного пути.

$.fn.removeElement=function(e){
    var l=this.length;
    while(l--){
        if(this[l]==e){
            console.log(this);
            this.splice(l,1);
            console.log(this);
            break;
}   }   }
var x=['a','b','c','d','e'];
console.log(x);
$(x).removeElement('c');
console.log(x);

результат, как показано ниже,

> ["a", "b", "c", "d", "e"]
> ["a", "b", "d", "e"]
> ["a", "b", "d", "e"]
> ["a", "b", "c", "d", "e"] //???

Я ожидаю ["a", "b", "d", "e"] в четвертой строке.

p.s. я не хочу "вернуть вещи" ..

Ответы [ 3 ]

0 голосов
/ 05 февраля 2012

Например, эта строка кода:

if('object'==typeof(e))

в вашем примере кода выглядит следующим образом:

if('object'==typeof(3))

, что составляет

if('object'=='number')

, чтоникогда не совпадать.

Я бы также спросил, почему вы пытаетесь обернуть обычный массив в объект jQuery.Было бы лучше просто использовать метод, который работает с массивом.

В качестве глобальной функции вы можете сделать это следующим образом:

function removeArrayElement(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
removeArrayElement(x, 'c');

В качестве глобального метода для объекта jQuery, вы можете сделать это так:

$.removeArrayElement = function(array, itemToRemove) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] === itemToRemove) {
            array.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
$.removeArrayElement(x, 'c');

Как метод объекта Array, вы можете сделать это так:

Array.prototype.removeElement = function(itemToRemove) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === itemToRemove) {
            this.splice(i, 1);
            break;
        }
    }
}

var x = ['a','b','c','d','e'];
x.removeElement('c');

Рабочий пример метода-прототипа здесь: http://jsfiddle.net/jfriend00/tEXWH/

0 голосов
/ 05 февраля 2012

jQuery уже имеет метод remove для своих собственных целей.

Если вы хотите удалить метод специально для нативного объекта JavaScript Array, вам просто нужно написать функцию внеконтекст jQuery:

Array.prototype.remove = function (el){
  for (var i = 0, j = this.length; i < j; i++){
    if (this[i] == el){
      this.splice(i, 1);
      break;
    }
  }
}

var x = ["a", "b", "c", "d"];
console.log(x);    // => [ 'a', 'b', 'c', 'd' ]
x.remove('b');
console.log(x);    // => [ 'a', 'c', 'd' ]
0 голосов
/ 05 февраля 2012

Из-за твоего if (typeof(e) == "object").Число (например, 3) не является "object".Это "number".

Я должен упомянуть: будьте осторожны при использовании $(foo), когда foo является массивом.jQuery иногда делает удивительные вещи (в зависимости от значений в массиве).Лучше было бы использовать $.removeElement(myArray, toRemove).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...