2015-09-02 6 views
3

Я пытаюсь найти лучший способ заменить последние N элементов в массиве. Я имею в виду следующее:Заменить последние N элементов в массиве с помощью JavaScript

Удалите N количество элементов из массива:

arr = arr.slice(-N); 

Добавьте нужные значения с помощью Array.push() делает итерации, чтобы добраться до количества необходимых вставок например:

for(var i=0; i<=N; i++) { 
    arr.push(new value); 
} 

Есть ли более элегантное решение для этого?

Спасибо.

+0

Значимость, которую нужно нажимать на все то же самое? – axelduch

+0

@aduch Да. Все значения для вставки одинаковы. – cycero

ответ

8

простой обратный цикл будет достаточно, как это:

for(i = arr.length - 1; i >= arr.length - N; i--) { 
    arr[i] = new_value; 
} 
+0

Dang! Ты подтолкнул меня на это. –

+1

Ха-ха! удачи в следующий раз человек! :) –

+1

Ваше условие цикла немного неверно, должно быть 'i> = arr.length - N', так как вопрос задан как заменить последние элементы' N'. –

0

Array.prototype.splice

Удаляет и, возможно, добавляет значения в массив, начиная и заканчивая при любом значении индекса.

пример:

var arr = [1, 2, 3, 4]; 
arr.splice(-1, 1, 'a', 'b', 'c'); 
+0

Я собирался предложить сращивание, но ответ Таруна самый выразительный :) –

1

Более функциональный способ сделать это было бы использовать смесь ломтиком и CONCAT.

function replaceItemsAtEnd(array, replacements) { 
    var start = array.slice(0, array.length - replacements.length); 
    return start.concat(replacements); 
} 

Это имеет преимущество, не изменяя исходный массив.

Использование массива в качестве элементов замены означает, что вы не ограничены заменой с одинаковым значением.

0

решение Tarun было первым, что пришло мне в голову, но я хотел бы изменить его немного, чтобы избежать ситуации, когда длина массива меньше, чем N. Таким образом, становится:

for(i = arr.length - 1; i>= 0 && N > 0; i--) { 
     arr[i] = new_value; 
     N--; 
    } 
0

Как насчет:

var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']; 
var anotherArr = [1, 2, 3]; 

Array.prototype.splice.apply(arr, [arr.length-anotherArr.length, anotherArr.length].concat(anotherArr)); 

?

3

Вы можете использовать массив .fill() для этого.

var arr = [1, 2, 3, 4, 5, 6]; 
 
var N = 3; 
 

 
var newValue = 0; 
 

 
arr = arr.fill(newValue, -1 * N); 
 

 
document.getElementById("output").innerHTML = arr;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<div id="output"></div>

за последние N элементов заменяются NewValue. Обратите внимание: IE и Opera не поддерживают этот метод, но вы можете написать код, который будет создавать метод, если его «не хватает». См. MDN page on .fill() для полизаполнения, чтобы добавить метод, если ваш браузер его не поддерживает.

+1

FWIW, Edge тоже поддерживает его (пока не упоминается на странице MDN). – georg

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