给出如下JS:
for (c in chars) {
for (i in data) {
if (data[i].item === chars[c]) {
// do my stuff;
}
else { /* do something else */}
}
}
和数据如下:
var chars = [ 'A', 'B', 'C', 'A', 'C' ];
var data = [
{'item':'A', 'rank': '1'},
{'item':'B', 'rank': '2'},
{'item':'C', 'rank': '3'}
// no duplicate
];
是否有更简单的语法来表达,而不是嵌套的for
循环和内部条件?
我尝试匹配两个数据集,更准确地说是使用chars
的键来迭代data
并找到值。
答案 0 :(得分:1)
你可以这样做:
for (i = 0; i < data.length; i++) {
if (chars.indexOf(data[i].item) != -1) {
// Do something
} else {
// Do something else
}
}
但是,如果chars
很大,我会创建一个对象,其对象是chars
的元素并使用if (chars_obj[data[i].item])
。这比每次搜索数组更有效。
答案 1 :(得分:1)
简化代码的另一种方法是将其封装并抽象到接受回调的实用程序中,而不是在需要时重用它,如下所示:
// definition
function eachChar(onMatch, onMismatch) {
for (c in chars) {
for (i in data) {
if (data[i].item === chars[c]) {
typeof onMatch === 'function' && onMatch();
} else {
typeof onMismatch === 'function' && onMismatch();
}
}
}
}
// usage examples
eachChar(function() {
// do something when it's a match
});
eachChar(function() {
// do something when it's a match
}, function() {
// do something else when it's not
});
作为旁注,您需要显式声明用作循环索引的变量,以便不在外部作用域中公开它们(例如全局作用域):
// that:
for (c in chars) {
for (i in data) {
// would become this:
for (var c in chars) {
for (var i in data) {
答案 2 :(得分:0)
由于您标记了问题jquery,因此可以使用jquery解决方案:
$.each(chars, function (cndx, chr) {
$.each(data, function (dndx, datum) {
if (datum.item === chr) {
// do my stuff;
} else {
/* do something else */
}
}
});
不再简洁,但至少你不需要索引。