2017-02-23 16 views
0

Я пытаюсь написать логику, чтобы удалить элемент пропускания indexArr (который содержит индексы для удаления) способ:Как удалить элементы из массива из разных индексов одним методом?

var a = [0,1,2,3,4,5]; 
 
Array.prototype.removeElem = function(indexArr){ 
 
\t this.filter(function(value,index,arr){ 
 
\t return indexArr.indexOf(index)>-1 ? arr[index] = undefined:false 
 
    \t } 
 
\t }); 
 
} 
 

 
a.removeElem([2,3]); //passing indexes in form of array 
 
console.log(a.join('').split('')); //removing undefined values

Как вы можете видеть, я удаление undefined значения после выполнение метода removeElem(), но я хочу сделать это в самом методе.

+0

Если вы ожидаете '.removeElem()' мутировать массив это называется на, самое простое решение переписать его с помощью для цикла и '.splice()', так что он может фактически удалить элементы из массива 'this'. Метод '.filter()' не изменяет массив 'this', он создает новый массив; если вы не используете его возвращаемое значение, вы должны использовать '.forEach()'. (Если вы * * использовали свое возвращаемое значение, обратный вызов 'filter()' может быть однострочным, например 'return indexArr.indexOf (index)> - 1;'.) – nnnnnn

+0

не может сделать это с помощью сплайсинга, beacuse splice изменяет массив –

+0

Я сказал: «Если вы ожидаете' .removeElem() 'для мутации массива, на который он вызван», похоже, вы используете его в показанном коде. Если вы хотите '.removeElem()' возвращать массив * new *, то вы можете определенно использовать '.filter()'. – nnnnnn

ответ

2

Чтобы изменить исходный массив, вы можете использовать while() цикл от последнего до первого индекса в сочетании с splice() методом:

var a = [0,1,2,3,4,5]; 
 

 
Array.prototype.removeElem = function(indexArr){ 
 
    var length = this.length; 
 
    while(length--) { 
 
    if(indexArr.indexOf(length) > -1) { 
 
     this.splice(length, 1); 
 
    } 
 
    } 
 
} 
 

 

 
console.log(a.removeElem([0,1])); 
 
console.log(a);

+0

Я думаю, что OP ожидает, что метод '.removeElem()' мутирует массив, на который он вызывается (например, '.splice()' does). – nnnnnn

+0

Я хочу передать индекс в removeElem не значение –

+0

Я неправильно понял первый раз. Отредактировано сейчас, наслаждайтесь. – wscourge

-2

использовать метод сращивания для добавления и удаления элемента из массива

+0

Я хочу удалить несколько элементов –

0

вы можете использовать сокращение для этого.

проверки следующего фрагмент код

var a = [0, 1, 2, 3, 4, 5]; 
 
Array.prototype.removeElem = function(indexArr) { 
 
    return this.reduce((result, key, index) => { 
 
    if (indexArr.indexOf(index) === -1) { 
 
     result.push(key) 
 
    } 
 
    return result 
 
    }, []) 
 
} 
 

 

 
var result = a.removeElem([2, 3]); //passing indexes in form of array 
 

 
console.log(result.join('').split(''));

Надеется, что это помогает

1

EDIT:

var a = [0,1,2,3,4,5]; 
 
Array.prototype.removeElem = function(indexArr){ 
 
    indexArr.sort(); 
 
    i=indexArr.length; 
 
    while(i--) 
 
    { 
 
    a.splice(indexArr[i],1); 
 
    } 
 
} 
 

 
a.removeElem([2,3]); //passing indexes in form of array 
 
console.log(a);

+0

Ваш код не удаляет указанные элементы. (Результат в вашем примере должен быть '[0,1,4,5]'.) – nnnnnn

+0

Я спрашиваю другую вещь, ваш код меняет массив, пожалуйста, проверьте –

+0

OP попросят удалить индексы, и мой код удалит указанный индекс из массива –

1

Не нужно использовать Array.filter(). Попробуйте что-то вроде этого:

let a = [0, 1, 2, 3, 4, 5]; 
 
Array.prototype.removeElem = function(indexArr) { 
 
    let removedElem = 0; 
 
    for (let i = 0; i < indexArr.length; i++) { 
 
     this.splice(indexArr[i] - removedElem, 1) 
 
     removedElem += 1; 
 
    }; 
 
    return this; 
 
} 
 
console.log(a.removeElem([2, 3]));

просто :)

+0

спасибо @siam, за быстрый ответ –