2016-07-06 65 views
-2

我想寫一個js腳本,它接受一個json文件的內容,然後 將html編碼(通過node.js包)應用到對象值,然後吐回了成JSON文件從for循環的輸出創建一個js對象

我覺得我有什麼,我需要做的是開始和結束。 我可以從CONSOLE.LOG,編碼被成功地應用到每個對象的價值,但我不知道如何從連貫的for循環的編碼結果重新創建一個js對象看。

我想知道我怎麼可以重新創建ARR變量一旦值被編碼(如果是去了解它的正確方法),這樣我就可以再字符串化和輸出一個JSON文件。

由於

var arr = { 
    "a": "Some strings of text", 
    "b": "to be encoded", 
    "c": "& converted back to a json file", 
    "d": "once they're encoded" 
}; 
for(var i=0;i<arr.length;i++){ 
    var obj = arr[i]; 
    for(var key in obj){ 
     var attrName = key; 
     var attrValue = obj[key]; 
     var encodedAttrValue = encode(attrValue); 

     console.log(encodedAttrValue); // checking encoding is successful 

     var outputJson = // recreate a js object with the cumulated output of the encoding i.e. each encodedAttrValue 


     var outputFilename = 'encoded.json'; 
     fs.writeFile(outputFilename, JSON.stringify(outputJson, null, 4), function(err) { 
      if(err) { 
      console.log(err); 
      } else { 
      console.log("Encoded version has been saved to " + outputFilename); 
      } 
     }); 
    } 
} 
+0

嘗試'Object.keys(stuffToBeEncoded).map()'。 – gcampbell

+0

你爲什麼要循環一個對象,就像它是一個數組,然後再次循環內部? – 2016-07-06 17:42:50

回答

0

簡單Array.prototype.reduceObject.assign會做

// objectMap reusable utility 
function objectMap(f,a) { 
    return Object.keys(a).reduce(function(b,k) { 
    return Object.assign(b, { 
     [k]: f(a[k]) 
    }) 
    }, {}) 
} 

var arr = { 
    "a": "Some strings of text", 
    "b": "to be encoded", 
    "c": "& converted back to a json file", 
    "d": "once they're encoded" 
} 

var encodedValues = Object.keys(arr).reduce(function(out,k) { 
    return Object.assign(out, {[k]: encode(arr[k])}) 
}, {}) 

fs.writeFile(outputFilename, JSON.stringify(encodedValues, null, 4), function(err) { 
    if (err) 
    console.error(err.message) 
    else 
    console.log("Encoded values have been saved to %s", outputFilename) 
}) 

下面是用嘲笑encode功能的代碼片段向您展示中間encodedValues

// pretend encode function 
 
function encode(value) { 
 
    return value.toUpperCase() 
 
} 
 

 
// objectMap reusable utility 
 
function objectMap(f,a) { 
 
    return Object.keys(a).reduce(function(b,k) { 
 
    return Object.assign(b, { 
 
     [k]: f(a[k]) 
 
    }) 
 
    }, {}) 
 
} 
 

 
var arr = { 
 
    "a": "Some strings of text", 
 
    "b": "to be encoded", 
 
    "c": "& converted back to a json file", 
 
    "d": "once they're encoded" 
 
} 
 

 
var encodedValues = objectMap(encode, arr) 
 

 
console.log(JSON.stringify(encodedValues, null, 4)) 
 

 
// { 
 
// "a": "SOME STRINGS OF TEXT", 
 
// "b": "TO BE ENCODED", 
 
// "c": "& CONVERTED BACK TO A JSON FILE", 
 
// "d": "ONCE THEY'RE ENCODED" 
 
// }

+0

*'return Object.assign(out,{[k]:encode(arr [k])})* *這與'out [k] = encode(arr [k])不同。退出;'除了它是一條線而不是兩條?在任何情況下,編寫一個名爲'objectMap'的小工具是不是更清潔? – 2016-07-06 17:41:11

+0

謝謝naomik!當我將它與node.js包結合使用時,使用您的代碼片段可以完美地工作。我會花一些時間去MDN學習一些關於這些方法的更多信息,因爲他們對我來說是新手(一位js新手)並瞭解他們的工作方式。 thankyou – fivedoor

+0

@torazaburo,我在我自己的代碼中使用了一個objectMap實用程序,但爲了保持此代碼稍微冗長,我這次跳過了它。我會更新答案。 – naomik

-1

通過JSON對象循環時,使用.push(obj)方法。

首先將outputJson從循環中取出,然後在完成編碼時將對象推送到outputJson

outputJson.push({ 
    attrName: key, 
    attrValue: encodedAttrValue 
}); 

這應該可以做到。

+1

這將創建一個微型對象數組,而不是具有映射值的對象。 – 2016-07-06 17:43:42

0

你可以這樣寫以直接的方式as:

newObj = {}; 
for (k in obj) { newObj[k] = encode(obj[k]); }