Поиск и сортировка по массиву - PullRequest
0 голосов
/ 29 апреля 2020

Привет У меня есть массив, как показано:

var mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];

И у меня есть массив имен, которые я хочу найти из основного массива:

var searchArray = ['Fernando', 'Harper'];

Я хочу новый массив, который следует поискать 'Fernando' и 'Harper', добавить его в новый массив и затем добавить к нему остаток массива.

var newArrAfterSearch = ['Fernando', 'Harper', 'Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Gary']

Попробовал несколько вещей безуспешно, например:

var newArrAfterSearch = [];
mainArray.forEach(name => 
 var nameFound = searchArray.find(searchName => searchName === name);
 if(nameFound) {
   newArrAfterSearch = [... mainArray, nameFound];
 }
)

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Вы можете создать функцию секционирования с помощью Array.reduce(), а затем сгладить результаты с помощью Array.flat().

Функция partition() принимает предикат и возвращает массив с 2 подмассивами. Любой элемент, который предикат возвратил в форме true, будет помещен в 1-й вложенный массив (индекс 0), а все остальные во 2-й вложенный массив (индекс 1).

const mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];
const searchArray = ['Fernando', 'Harper'];

const partition = (predicate, arr) =>
  arr.reduce((r, s) => {   
    r[predicate(s) ? 0 : 1].push(s);
    
    return r;
  }, [[], []]);

const result = partition(s => searchArray.includes(s), mainArray)
  .flat();
  
console.log(result);
1 голос
/ 29 апреля 2020

Я думаю forEach для итерации массива поиска, splice для удаления элемента и unshift для добавления его снова в начале будет просто:

var mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];
var searchArray = ['Fernando', 'Harper'];
searchArray.reverse().forEach(v => {
  var index = mainArray.indexOf(v);
  if(-1 !== index){
    mainArray.splice(index, 1);
    mainArray.unshift(v);
  }
})
console.log(mainArray);
1 голос
/ 29 апреля 2020

Вы можете использовать filter и includes, отфильтровать все значения из mainArray, который появляется в searchArray, затем объединить searchArray с mainArray

const mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];
const searchArray = ['Fernando', 'Harper'];

const rest = mainArray.filter(v => !searchArray.includes(v))
console.log([...searchArray, ...rest])

Если ваш searchArray имеет значения, которые недоступны в mainArray, при фильтрации значений из mainArray мы можем отслеживать возникшие значения, а при объединении мы можем фильтровать searchArray как хорошо

const mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];
const searchArray = ['Fernando', 'Harper', 'something random'];

const mapper = Object.create(null)
const rest = mainArray.filter(v =>{
 mapper[v] = true
 return !searchArray.includes(v)
})
console.log([...searchArray.filter(v=> mapper[v]), ...rest])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...