如何使用文件名数组筛选文件路径数组

How to filter array of file paths using array of file names

本文关键字:数组 文件 路径 筛选 文件名 何使用      更新时间:2023-09-26

使用lodash,如何使用文件名数组过滤出文件路径数组?

var imageNames = ['/Users/x/edm/images/advertiser.jpg', '/Users/x/edm/images/advertiser_mob.jpg', '/Users/x/edm/images/app_store_button.jpg', '/Users/x/edm/images/header.jpg'];
var usedImageNames = ['app_store_button.jpg', 'advertiser.jpg'];
_.mixin({
  findArrayItemsUsingArray: function (collection, values) {
    return _.filter(collection, function (fileName) {
      _.each(values, function (imageName) {
        if (_.endsWith(fileName, imageName))
          return true;
      });
    })
  }
})
console.log(_.findArrayItemsUsingArray(imageNames, usedImageNames));

假设POSIX文件路径(用/分隔):

在ES6:中

imageNames.filter(path => {
  let parts = path.split('/')
  let file = parts[parts.length -1]
  return usedImageNames.indexOf(file) !== -1
})

在ES5:中

imageNames.filter(function (path) {
  var parts = path.split('/')
  var file = parts[parts.length -1]
  return usedImageNames.indexOf(file) !== -1
})

在Lodash:

_.filter(imageNames, function (path) {
  return _.includes(usedImageNames, _(path).split('/').last())
})

在Lodash+ES6:中

imageNames.filter(path => _.includes(usedImageNames, _(path).split('/').last()))

可以_.endsWith()进行比较,但请考虑如果imageNames阵列中有/path/to/somefilename.jpg/path/to/filename.jpg,而usedImageNames阵列中只有filename.jpg,会发生什么情况。

类似地,您也可以使用类似.endsWith('/' + name)的方法,但为了清晰起见,我更喜欢拆分和最后一个方法。

我做了一些性能测试。结论:不要使用Lodash;)这个带有regexp的版本有时会稍微快一点,但它缺乏清晰度可能不值得:

imageNames.filter(function(path) {
  return usedImageNames.indexOf(path.match(/'/([^/]+)$/)[1]) !== -1
})
var objArray = imageNames.map(function(path) {
  var splitted = path.split("/");
  return {name: splitted[splitted.length - 1],
          path: path};
});
_.sort(objArray, "name");