迭代 JSON 格式的对象数组并修改和扩展它,最好使用 Underscore.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"
}]
}]
我需要遍历数组并执行以下操作:
对于 TAB 中的每个问题,如果问题有答案,我需要在问题中添加额外的 key/value of "HAS_ANSWER": "1"。
{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer",
"HAS_ANSWER": "1"
}
我花了几个小时阅读帖子、查看示例代码和阅读 Underscore 文档,我知道这应该相当简单,但我不知道如何解决这个问题。
我的理解是我可能想使用嵌套的 _.map 函数,但是我看过的所有示例 return 对象数组的子集,而不是修改和扩展一个,我需要得到完全相同格式的 JSON 数据(对象数组),但有上面提到的更改和添加。
如有任何帮助,我们将不胜感激。
更新:
使用这个:
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
这会遍历问题,并相应地修改它们,但是 returned 对象会删除外层数据 - 它只是 return 一个问题数组,并且不会保留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>
Underscore/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);
这种方法修改了数据。
我从数据库中以 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"
}]
}]
我需要遍历数组并执行以下操作:
对于 TAB 中的每个问题,如果问题有答案,我需要在问题中添加额外的 key/value of "HAS_ANSWER": "1"。
{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer",
"HAS_ANSWER": "1"
}
我花了几个小时阅读帖子、查看示例代码和阅读 Underscore 文档,我知道这应该相当简单,但我不知道如何解决这个问题。
我的理解是我可能想使用嵌套的 _.map 函数,但是我看过的所有示例 return 对象数组的子集,而不是修改和扩展一个,我需要得到完全相同格式的 JSON 数据(对象数组),但有上面提到的更改和添加。
如有任何帮助,我们将不胜感激。
更新:
使用这个:
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
这会遍历问题,并相应地修改它们,但是 returned 对象会删除外层数据 - 它只是 return 一个问题数组,并且不会保留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>
Underscore/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);
这种方法修改了数据。