如何使用文件名数组过滤文件路径数组

时间:2015-12-11 22:25:02

标签: javascript arrays lodash

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

2 个答案:

答案 0 :(得分:2)

假设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()进行比较,但请考虑如果/path/to/somefilename.jpg数组中有/path/to/filename.jpgimageNames会发生什么情况,但只有filename.jpg中的usedImageNames

同样,您也可以使用类似.endsWith('/' + name)的内容,但为了清晰起见,我更倾向于采用分裂式方法。

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

imageNames.filter(function(path) {
  return usedImageNames.indexOf(path.match(/\/([^/]+)$/)[1]) !== -1
})

答案 1 :(得分:0)

var objArray = imageNames.map(function(path) {
  var splitted = path.split("/");
  return {name: splitted[splitted.length - 1],
          path: path};
});

_.sort(objArray, "name");