2015-12-11 40 views
0

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

回答

1

假設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)之類的東西,但爲了清晰起見,我更傾向於採用拆分和倒數的方法。

我已經做了一些performance testing。結論:不使用Lodash;)這個版本與正則表達式有時稍快,但其缺乏明確的可能是不值得的:

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

一個驚人的和好詳細的解答。謝謝。 – rickysullivan

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

_.sort(objArray, "name"); 
相關問題