2017-06-08 36 views
0

我需要的JavaScript將一些對象是這樣的:如何刪除「」轉換Javascript對象時,.csv文件?

{available :null 
avg: null 
current:116 
max:null 
min:null 
status:"Pending, Charged Off" 
balance:-166085.77} 

用別人的JS代碼,加入一點點我的GET API,其中包括兩個函數的第一個代碼轉換:

$scope.convertArrayOfObjectsToCSV = function (args) { 
     var result, ctr, keys, columnDelimiter, lineDelimiter, data; 

     data = args.data || null; 
     if (data == null || !data.length) { 
      return null; 
     } 

     columnDelimiter = args.columnDelimiter || ','; 
     lineDelimiter = args.lineDelimiter || '\n'; 

     keys = Object.keys(data[0]); 

     result = ''; 
     result += keys.join(columnDelimiter); 
     result += lineDelimiter; 

     data.forEach(function(item) { 
      ctr = 0; 
      keys.forEach(function(key) { 
       if (ctr > 0) result += columnDelimiter; 

       result += item[key]; 
       ctr++; 
      }); 
      result += lineDelimiter; 
     }); 

     return result; 
    } 

第二,一個用於下載:

$scope.downloadCSV = function (args) { 
     var data, filename, link; 
     //my code: 
     $http.get(
       apis[$scope.selectedKeys[0]] 
      ).success(function (data) { 
        $scope.data = data; 
     }) 
     var stringData = angular.toJson($scope.data.items); 
     $scope.newData = JSON.parse(stringData); 
     console.log($scope.newData); 
     //my code end 
     var csv = $scope.convertArrayOfObjectsToCSV({ 
      data: $scope.newData 
     }); 
     if (csv == null) return; 

     // filename = args.filename || 'export.csv'; 
     filename = $scope.selectedKeys[0] + '.csv'; 

     if (!csv.match(/^data:text\/csv/i)) { 
      csv = 'data:text/csv;charset=utf-8,' + csv; 
     } 
     data = encodeURI(csv); 

     link = document.createElement('a'); 
     link.setAttribute('href', data); 
     link.setAttribute('download', filename); 
     link.click(); 
    } 

它工作正常,只有一個問題是,當一些列用逗號狀這在object:status:「Pending,Charged Off」將被轉換爲csv文件中的另一列。我想我需要用這條線做點什麼:

columnDelimiter = args.columnDelimiter || ','; 

但是不知道該怎麼辦?任何人都可以幫忙嗎?先進的謝謝!

+0

我不知道你是否需要自己做,或者你可以只使用一個開源圖書館,也有JSON到CSV轉換相當多的庫[這裏只是我發現的結果之一(https://www.npmjs.com/package/json-2-csv),大多數都會有一些辦法幫助與那些問題 –

+0

謝謝@PatrickBarr絕對,我會檢查他們。 –

回答

0

一個自制的溶液可以是使用了引號。

foo,"foo,bar",bar 

被解釋爲CSV爲:

[ "foo", "foo,bar", "bar" ] 

但是,如果你的價值也有什麼雙引號

$scope.convertArrayOfObjectsToCSV = function (args) { 
     var result, ctr, keys, columnDelimiter, lineDelimiter, data; 

    data = args.data || null; 
    if (data == null || !data.length) { 
     return null; 
    } 

    columnDelimiter = args.columnDelimiter || ','; 
    lineDelimiter = args.lineDelimiter || '\n'; 

    keys = Object.keys(data[0]); 

    result = ''; 
    result += keys.join(columnDelimiter); 
    result += lineDelimiter; 

    data.forEach(function(item) { 
     ctr = 0; 
     keys.forEach(function(key) { 
      if (ctr > 0) result += columnDelimiter; 

      result += '"' + item[key].replace('\"', """) + '"'; 
      ctr++; 
     }); 
     result += lineDelimiter; 
    }); 

    return result; 
} 
+0

是什麼''"幹什麼呀?你在HTML中輸出CSV嗎? – Halcyon

+0

嗨NicolòBoschi,非常感謝你!它會拋出一個錯誤:item [key] .replace不是一個函數,但我認爲這是正確的方向。 –

+0

嗨尼科洛Boschi,你的答案是正確的,只是我的一些數據:項目[關鍵]有不同的數據類型,通過你的答案這樣的啓發,我添加的代碼夫婦行,它的工作原理:如果(typeof運算(項目[關鍵]) === 「字符串」 &&項[鍵] .includes( 「 」)){ \t \t \t \t \t \t項[鍵] =項[鍵] .replace( '\「',」 "「); \t \t \t \t} \t \t \t \t結果+ =' 「+項目[鍵] + ''」;! –

0

要獲得,的值用雙引號"環繞它在裏面?即:

foo,"foo",bar",bar 

現在,這只是一個爛攤子。

foo,"foo"",bar",bar 

給出:您可以通過添加另一雙引號需要逃生雙引號

[ "foo", "foo\",bar", "bar" ] 
+0

謝謝這是非常有幫助的。 –