2017-03-17 72 views
0

可以使用什麼自定義函數(在節點中),如果傳遞三個參數,即filePath,basePathdestPath,它將返回一個新路徑。例如。在給定文件路徑,基路徑和新的目標路徑的情況下返回新路徑的節點/ JavaScript函數

實例函數簽名

var path = require('path'); // Nodes `path` module is likely to help? 

/** 
* Returns a new filepath 
* @param {String} filePath - The path to the source file. 
* @param {String} basePath - The path to determine which part of the 
*  FilePath argument is to be appended to the destPath argument. 
* @param {String} destPath - The destination file path. 
* @return {String} The new filepath. 
*/ 
function foo(filePath, basePath, destPath) { 

    // ... ? 

    return newFilePath; 
} 

用法示例:

下面是調用的功能和價值的一些例子,我期望退換給出的參數傳遞:

// Example A 

var a = foo('./foo/bar/baz/quux/filename.json', 'foo/bar/baz/', './dist'); 

console.log(a) // --> 'dist/baz/quux/filename.json' 

// Example B 

var b = foo('./a/b/c/d/e/filename.png', './a/b/c', './images/logos/'); 

console.log(b) // --> 'images/logos/c/d/e/filename.png' 

// Example C 

var c = foo('images/a/b/filename.png', './images/a/b', 'pictures/'); 

console.log(c) // --> 'pictures/b/filename.png' 

更多信息

  1. 正如你可以從例如函數調用的basePathString看到會通知在filePath值應修剪的功能,其目的是類似的一口base optiongulp.src()功能使用。
  2. 參數String值(即路徑)將始終是相對的,但是,它們有時會包含當前目錄前綴./,有時不包括。尾部正斜槓/可能會或可能不會出現在路徑String上。
  3. 該解決方案必須在沒有任何附加依賴關係的情況下跨平臺工作。它也必須與
  4. 我已經使用path模塊的公用事業各種失敗嘗試初節點版本(> = 0.10.28),例如path.normalize然後分裂Array等等,等等。然而,I」可用m相當肯定path模塊將被用於解決方案中。

在此先感謝。

回答

2

你可以做到這一點使用簡單的字符串替換。在此之前就規範化路徑。

  1. 文件路徑和基本路徑:如果他們開始用./,將其刪除。
  2. 基本路徑:如果它與/結束刪除它,然後(在你的第一個例子baz)刪除最後一個路徑部分
  3. filePath.replace(basePath, destPath)
1

function foo(filePath, basePath, destPath) { 
 
    if(filePath.charAt(0)=='.'){ 
 
     filePath=filePath.substr(1,filePath.length); 
 
    } 
 
    if(filePath.charAt(0)=='/'){ 
 
     filePath=filePath.substr(1,filePath.length); 
 
    } 
 
    if(basePath.charAt(0)=='.'){ 
 
     basePath=basePath.substr(1,basePath.length); 
 
    } 
 
    if(basePath.charAt(0)=='/'){ 
 
     basePath=basePath.substr(1,basePath.length); 
 
    } 
 
    if(destPath.charAt(0)=='.'){ 
 
     destPath=destPath.substr(1,destPath.length); 
 
    } 
 
    if(destPath.charAt(0)=='/'){ 
 
     destPath=destPath.substr(1,destPath.length); 
 
    } 
 
    if(basePath.charAt(basePath.length-1)!='/'){ 
 
     basePath+="\/"; 
 
    } 
 
    if(destPath.charAt(destPath.length-1)!='/'){ 
 
     destPath+="\/"; 
 
    } 
 
    var temp = basePath.split('/')[basePath.split('/').length-2]; 
 
    var newFilePath = temp+'/'+filePath.split(basePath)[1]; 
 
    newFilePath=destPath+'/'+newFilePath; 
 
    return newFilePath.replace(/\/\//g,"/"); 
 
} 
 
// Example A 
 

 
var a = foo('./foo/bar/baz/quux/filename.json', 'foo/bar/baz/', './dist'); 
 

 
console.log(a) // --> 'dist/baz/quux/filename.json' 
 

 
// Example B 
 

 
var b = foo('./a/b/c/d/e/filename.png', './a/b/c', './images/logos/'); 
 

 
console.log(b) // --> 'images/logos/c/d/e/filename.png' 
 

 
// Example C 
 

 
var c = foo('images/a/b/filename.png', './images/a/b', 'pictures/'); 
 

 
console.log(c) // --> 'pictures/b/filename.png'

+0

感謝您看這個,但例如B和C導致雙向前砍了。 a ='。/ images/logos // b // d/e/filename.png'和 c ='pictures // a // filename.png'。 – RobC

+0

這些是哪些參數?你能告訴我他們的函數調用,所以我可以重現(並希望修復)錯誤? – Feathercrown

+0

道歉我以前的評論說** a = **,它應該說** b = **只需使用示例B和C(在我的OP中定義)在節點中調用您的函數,並且您應該看到雙正斜槓在結果日誌中。 – RobC