Удалить номер из массива и сдвинуть оставшиеся - PullRequest
0 голосов
/ 26 сентября 2019

В JavaScript, имея массив чисел, подобный этому:

let a = [1, 2, 3, 4, 5]

Как бы вы удалили элемент, например, 3, и сместили оставшиеся, чтобы результирующий массив был [1, 2, 3, 4], а не [1, 2, 4, 5].

В настоящее время я использую этот фрагмент:

a.concat(a.splice(a.indexOf(3)).slice(1).map(b => b - 1));

но что может быть проще / эффективнее?

РЕДАКТИРОВАТЬ:

Поскольку меня попросили предоставить больше контекста, у меня есть компонент, похожий на вкладки, и мне нужно отслеживать открытые вкладки по индексу.Пользователь также может добавлять и удалять вкладки, поэтому, если у меня открыты вкладки 6 и 10, а пользователь удаляет вкладку 3, то открытые вкладки становятся 5 и 9.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Вы можете начать с индекса числа и настроить все остальные следующие значения.В конце выскочить последний элемент.

var array = [1, 2, 3, 94, 95], // 9x, to show the use of the values
    remove = 3,
    index = array.indexOf(remove);
    
while (index + 1 < array.length) array[index] = array[++index] - 1;

array.pop();

console.log(array);
0 голосов
/ 26 сентября 2019

Вы можете использовать уменьшение, если индекс меньше указанного индекса, затем нажать значение, если оно равно, ничего не делать, а если оно больше, минус 1, а затем нажать его:

let a = [1, 3, 5, 7, 9]
const index = 2

console.log(a.reduce((a, e, i) => (i < index ? a.push(e) : i > index && a.push(--e), a), []))

Это тот же код, только что написанный более читабельно:

let a = [1, 3, 5, 7, 9]
const index = 2

console.log(a.reduce((a, e, i) => {
  if(i < index) {
    a.push(e)
  } else if(i > index) {
    a.push(--e)
  }
  return a
}, []))

С точки зрения производительности, этот код является O (n), так как существует только один цикл, но и ваш код.Я бы не беспокоился о производительности, я бы волновался, если бы вы пытались обработать что-то, что зависит от производительности от внешнего интерфейса.

0 голосов
/ 26 сентября 2019

Изначально вариация Нины, но после редактирования она сильно отличается.

var array = [1, 2, 3, 94, 95],
  remove = 3,
  index = array.indexOf(remove);
  var res;
  for (i = 0; i < array.length; i++) {
    res = array[i];
    if (array[i] > 9) res = parseInt(array[i].toString().split('').pop());
    if (res === index) array.splice(res, 1);
  }
console.log(array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...