使用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));
答案 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.jpg
和imageNames
会发生什么情况,但只有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");