【问题标题】:Array search and sort数组搜索和排序
【发布时间】:2020-08-13 11:56:08
【问题描述】:

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

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


【解决方案1】:

您可以使用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])

【讨论】:

    【解决方案2】:

    您可以使用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);

    【讨论】:

      【解决方案3】:

      我认为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);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 2011-06-14
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多