数组搜索和排序

问题描述 投票:0回答:3

嗨,我有一个如图所示的数组:

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];
 }
)
javascript arrays sorting search
3个回答
1
投票

您可以使用filterincludes,从出现在searchArray中的mainArray过滤掉所有值,然后将searchArraymainArray合并

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])

1
投票

您可以使用Array.reduce()创建分区函数,然后使用Array.flat()展平结果。

partition()函数采用一个谓词,并返回包含2个子数组的数组。谓词返回true形式的任何项目都将被推到第一个子数组(索引0),所有其他项被推到第二个子数组(索引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);

0
投票

我认为forEach迭代搜索数组,splice删除该项目,然后再unshift在开始时再次添加它:

var mainArray = ['Adam', 'Bailey', 'Cathy', 'Dave', 'Earl', 'Fernando', 'Gary', 'Harper'];
var searchArray = ['Fernando', 'Harper'];
searchArray.reverse().forEach(v => {
  mainArray.splice(mainArray.indexOf(v), 1);
  mainArray.unshift(v);
})
console.log(mainArray);
© www.soinside.com 2019 - 2024. All rights reserved.