简化我的函数(循环、数组)
Simplify my function (loop, array)?
我有一个重复几次的函数,我相信可以简化和发送数组中的变量。
var i = masterdata.timing.split(',');
var index = 0;
for (index = 0; index < i.length; ++index) {
$("#timing_" + i[index].trim()).prop('checked', true);
}
var i = masterdata.concern.split(',');
var index = 0;
for (index = 0; index < i.length; ++index) {
$("#concern_" + i[index].trim()).prop('checked', true);
}
var i = masterdata.steps.split(',');
var index = 0;
for (index = 0; index < i.length; ++index) {
$("#steps_" + i[index].trim()).prop('checked', true);
}
也许只是将类别更改为一个变量,然后从数组中发送类别?
var chkgroup = [
'timing, concern, steps'
]
你的想法应该很好:
var i;
var index = 0;
var j = 0;
var chkgroup = ['timing', 'concern', 'steps'];
var currentGroup;
for (j = 0; j < chkgroup.length; ++j) {
currentGroup = chkgroup[j];
i = masterdata[currentGroup].split(',');
for (index = 0; index < i.length; ++index) {
$("#" + currentGroup + "_" + i[index].trim())
.prop('checked', true);
}
}
如果chkgroup
数组确实与masterdata
中的对象keys
匹配,则可以使用外部for..in
循环:
var i;
var index = 0;
var currentGroup;
for (currentGroup in masterdata) {
i = masterdata[currentGroup].split(',');
for (index = 0; index < i.length; ++index) {
$("#" + currentGroup + "_" + i[index].trim())
.prop('checked', true);
}
}
请注意,没有为for...in
定义顺序,因此,如果需要保证按特定顺序迭代对象属性,则最好使用预定义的数组。
你也可以喜欢$.map
:
var values = $.map(masterdata, function (i, currentGroup) {
return $.map(i.split(','), function (val) {
return $('#' + currentGroup + '_' + val.trim());
});
});
$(values).prop('checked', true);
var chkgroup = [ 'timing', 'concern', 'steps' ];
setProps( chkgroup, masterdata );
function setProps( c, m ) {
$.each(c, function(i, group) {
var i = m[group]split(',');
var index = 0;
for (index = 0; index < i.length; ++index) {
$("#" + group + "_" + i[index].trim()).prop('checked', true);
}
});
}
事实上,您的代码仍然有点嘈杂且不可读,即开发人员必须花费至少几分钟的时间对其进行分析,以了解逻辑是否正确。使用loDash或Undercore,您的代码可以简化并变成这样:
var selector = _.chain(masterdata)
//pick only needed items
.pick(masterdata, 'timing', 'concern', 'steps')
.map(function (item, key) {
//split and transform the string into selector, e.g. #timing_1
var ids = item.split(',');
var mapped = _.map(ids, function (id) { return "#" + key + "_" + id.trim(); });
return mapped.join();
})
.value()
.join();
$(selector).prop('checked', true);
以及jsfiddle 上的工作样本
相关文章:
- javascript:数组循环
- 如何将数组循环到JSON代码中
- 而与数组循环
- JavaScript 数组/循环不起作用
- AJAX在数组循环中调用,只在上一次完成后调用next
- 数组循环以获取单个值
- JavaScript数组循环
- Javascript 2D数组循环停止
- 通过Javascript中的JSON数组循环
- 为什么以下 forEach 数组循环未返回未定义
- 如何在数组循环中过滤数据
- 如何在数组循环 222 中过滤数据
- 数组循环以确定范围平均值
- 对象的数组循环
- 对象键及其值的数组循环
- 虽然的缺点!未定义的数组循环
- 数组循环导致无限循环
- 数组循环 - 处理下拉列表中的空值
- 在 Node 中连接数组循环.js glob 结果
- JavaScript 图像数组循环