2016-07-06 68 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]); }