嗨,我有一个如图所示的数组:
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];
}
)
您可以使用filter
和includes
,从出现在searchArray
中的mainArray过滤掉所有值,然后将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])
您可以使用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);
我认为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);