有没有更有效的方法编写一组方法和函数,一个接一个地修改同一个变量?



我有一系列项目和报告需要从冗长的JavaScript数据文件(我无法修改(中提取和修改子数组。下面的示例包含分配给名为data的变量的用于演示目的的条目片段。我不能以任何方式更改data本身的数据结构的架构(实际上它是通过脚本标记src="[URL]"属性检索的(,并且此处显示以外的其他数据似乎不像 JSON 文件那样 100% 组织,如果它有所作为的话。

在下面的部分中,我将创建一个变量q5_yes该变量最终将保存来自调查"Question_5"的"是"响应的单个值数组。为了使其达到我需要的格式,我需要分几个步骤对其进行修改。

虽然我在下面的内容可以独立工作,但我想知道是否有更好的做法将这些步骤组合成一个步骤(理想情况下,将来也更容易重用,因为我将重复此过程很多(。

var data = {
"reSEQ": [{
"Entry_1": "Nov-2015",
"Question_5": [{
"Yes": 30
},
{
"No": 5
},
{
"Not Sure": 13
},
{
"Total": 48
}
],
"Question_6": [{
"Yes": 30
},
{
"No": 5
},
{
"Not Sure": 13
},
{
"Total": 48
}
]
}]
};
var q5_yes = data.reSEQ.map(function(e) {
return e.Question_5.map(function(e) {
return e.Yes;
});
});
var q5_yes = q5_yes.map(function(subarray) {
return subarray.filter(function(val) {
return val !== undefined;
});
});
var q5_yes = q5_yes.splice(0, q5_yes.length - 0);
var q5_yes = [].concat.apply([], q5_yes);
document.getElementById("foo").innerHTML = q5_yes;
<div id="foo">test</div>

编辑:我确实有一个解决方案来回答我自己的问题,那就是简单地将varq5_yes调用包装到一个带有参数的函数中,以使其可重用。它不会减少此部分代码的膨胀,但在对其他条目重复该过程时变得容易。

例:

function getQuestion(question, answer){
	var arrayCon = data.reSEQ.map(function(e) {
		return e[question].map(function(e) {
			return e[answer];
		});
	});
	arrayCon = arrayCon.map(function(subarray) {
		return subarray.filter(function(val) {
			return val !== undefined;
		});
	});
	arrayCon = arrayCon.splice(0, arrayCon.length - 2); //removes current & lifetime entries
	arrayCon = [].concat.apply([], arrayCon);
	
	return arrayCon
}

然后我只需创建一个 var 并将其设置为函数,例如var q5Value = getQuestion('Question_5', 'Yes')

给定问题的上下文,您可以确保所需的映射位于每个数组的第 0 个索引处,因此;

var data = {
"reSEQ": [{
"Entry_1": "Nov-2015",
"Question_5": [{
"Yes": 30
},
{
"No": 5
},
{
"Not Sure": 13
},
{
"Total": 48
}
],
"Question_6": [{
"Yes": 30
},
{
"No": 5
},
{
"Not Sure": 13
},
{
"Total": 48
}
]
}]
};
var q5_yes = data.reSEQ[0].Question_5[0].Yes;
document.getElementById("foo").innerHTML = q5_yes;
<div id="foo">test</div>

function getQuestion(question, answer){
	var arrayCon = data.reSEQ.map(function(e) {
		return e[question].map(function(e) {
			return e[answer];
		});
	});
	arrayCon = arrayCon.map(function(subarray) {
		return subarray.filter(function(val) {
			return val !== undefined;
		});
	});
	arrayCon = arrayCon.splice(0, arrayCon.length - 2); //removes current & lifetime entries
	arrayCon = [].concat.apply([], arrayCon);
	
	return arrayCon
}
var q5Value = getQuestion('Question_5', 'Yes') // to get the desired vals as an array

最新更新