对JSON格式的对象数组进行迭代,并对其进行修改和扩展,最好使用Undercore.js
Iterate over JSON formatted array of objects and modify and extend it, preferably using Underscore.js
我从一个JSON格式的数据库中检索到数据,该数据被分配给一个变量"var tabs"。
格式化的JSON如下:
[{
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": ""
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": ""
}]
}, {
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer"
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": "Some Still Different Answer"
}]
}]
我需要迭代数组并执行以下操作:
对于选项卡中的每个QUESTION,如果QUESTION有一个答案,我需要在QUESTION中添加一个额外的键/值"has_ANSWER":"1"。
{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer",
"HAS_ANSWER": "1"
}
我花了几个小时阅读文章、查看示例代码和阅读Undercore文档,我知道这应该相当简单,但我无法理解如何处理。
我的理解是,我可能想使用嵌套的_.map函数,但我看过的所有示例都返回了对象数组的子集,而不是修改和扩展的子集,并且我需要最终得到完全相同的格式化JSON数据(对象数组),但要有上面提到的更改和添加。
如有任何帮助,我们将不胜感激。
更新:
使用此:
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
这会迭代问题,并相应地修改它们,但返回的对象会删除外层数据——它只返回一个问题数组,而不会保留TAB数据:
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
解决方案是对外部数组使用_.each,对内部数组使用_.map。
data = _.each(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
注意:此=>语法仅适用于较新的Javascript实现,目前Safari/Webkit不支持此语法,因此请改用此语法以获得更好的兼容性
data = _.each(data, function(obj){
_.map(obj.QUESTIONS, function(q){
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
});
});
这正是我需要的方式。
这可以使用普通的JavaScript,使用Array#map
来完成。
// Iterate over data
data = data.map(obj => obj.QUESTIONS.map(q => {
// If question has answer, then add `HAS_ANSWER` property
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
// Update question object
return q;
}));
var data = [{
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": ""
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": ""
}]
}, {
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer"
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": "Some Still Different Answer"
}]
}];
data = data.map(obj => obj.QUESTIONS.map(q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
console.log(data);
document.getElementById('output').innerHTML = JSON.stringify(data, 0, 4);
<pre id="output"></pre>
Undercore/Lodash 中的相同代码
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
使用标准Javascript的Array.prototype.forEach()方法,它可以看起来像这样:
tabs.forEach(tab => {
tab['QUESTIONS'].forEach(question => {
if (question['ANSWER']) {
question['HAS_ANSWER'] = 1;
}
});
});
var tabs = [{
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": ""
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": ""
}]
}, {
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer"
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": "Some Still Different Answer"
}]
}];
tabs.forEach(tab => {
tab['QUESTIONS'].forEach(question => {
if (question['ANSWER']) {
question['HAS_ANSWER'] = 1;
}
});
});
console.log(tabs);
这种方法会修改现有的数据。
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 从popup.js|Chrome扩展访问DOM
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 事件侦听器未在chrome扩展中的options.js中启动
- JavaScript(Underscore.js)扩展功能
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 扩展JS代码
- 使用lodash'扩展JS对象实例;s的extend方法会导致奇怪的结果
- 如何通过在两个节点之间拖放来制作边缘,并在细胞空间中扩展 egdehandle 扩展.js
- 扩展 JS 6.无法将节点添加到树面板
- 扩展 JS Boolean.prototype 失败
- 扩展JS.向容器中添加现有对象会将其从源容器中删除
- 扩展js包含的模板
- "文件“;在mozilla扩展js模块中
- 参数不起作用的Chrome扩展-js
- getAttribute除了getElementsByTagName不工作在chrome扩展js脚本
- 如何正确扩展 JS 对象
- Chrome 扩展 js:在后台.js和弹出窗口.js之间共享功能
- jQuery不工作在后台的chrome扩展.js