Как переместить несколько элементов в начало массива? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть функция, которая принимает массив и строку в качестве аргументов. Задача состоит в том, чтобы проверить, встречается ли строка внутри функции и перемещается ли она на первое место массива.

function moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza')

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

Ответы [ 4 ]

2 голосов
/ 03 июня 2019

Вы можете отсортировать массив и проверить значение и переместить эти значения в начало.

function moveToFirstPlace(array, value) {
    return array.sort((a, b) => (b.toLowerCase() === value) - (a.toLowerCase() === value));
}

console.log(moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza'));
0 голосов
/ 03 июня 2019

Если важна эффективность, вы можете сделать это на месте с одним проходом O(n) (не считая toLowerCase), запустив индексы с каждого конца массива и поменяясь местами, когда правый индекс находит пиццу, а левый - не-пицца:

function moveToFirstPlace(arr, key){
  let i = 0, j = arr.length -1
  while (i < j){
    while(!arr[j].toLowerCase().includes(key)) j--;
    while(arr[i].toLowerCase().includes(key)) i++;
    if (i < j)
        [arr[j], arr[i]] = [arr[i], arr[j]];
    i++;
    j--;
  }
}
let arr = ['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA']
moveToFirstPlace(arr,'pizza')
console.log(arr)
0 голосов
/ 03 июня 2019

Вы можете использовать push и unshift вместе с toLowerCase() для создания нового массива.

function moveToFirstPlace(items, key) {
  let result = []
  items.forEach(itm => {
    itm.toLowerCase() == key.toLowerCase() ? result.unshift(itm) : result.push(itm)
  })
  return result
}

console.log(moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'], 'pizza'))
0 голосов
/ 03 июня 2019

Один из способов сделать это - применить filter к вашему массиву, один раз для определения совпадений и один раз для несоответствий. Затем просто объедините оба результата:

function moveToFirstPlace(arr, str) {
    str = str.toLowerCase();
    const matches = arr.filter(elem => elem.toLowerCase() === str);
    const misses = arr.filter(elem => elem.toLowerCase() !== str);
    return matches.concat(misses);
}

var arr = moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza');

console.log(arr);

Это сохранит исходный порядок соответствия элементов. Обратите внимание, что он не изменяет исходный массив, но возвращает новый массив как результат.

Вы также можете использовать более функциональный подход с reduce:

function moveToFirstPlace(arr, str) {
    str = str.toLowerCase();
    return arr.reduce((acc, elem) => (acc[+(elem.toLowerCase() === str)].push(elem), acc), [[], []])
              .reduce((a, b) => a.concat(b));
}

var arr = moveToFirstPlace(['pizza', 'Pasta', 'Burger', 'PiZZa', 'pizzA'],'pizza');

console.log(arr);

Оба решения имеют линейную сложность по времени.

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