使用以下代码,我应该检查数组(ai,jq和rz) 让用户拥有相同的兴趣'如果是这样,请从所有阵列中删除该用户。 但似乎.splice()方法不能正常工作,因为我记录数组并且它们仍然包含该用户。有什么想法吗?
代码:
function joinQueue(sid, interests, fn) {
var exists = false;
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.forEach(function(data) {
if(data.interest == interest && !exists) {
var aa = 0;
ai.forEach(function(a) {
if(a.sid == data.sid) { ai.splice(aa, 1); console.log(ai);}
aa++;
});
var jj = 0;
jq.forEach(function(j) {
if(j.sid == data.sid) { jq.splice(jj, 1); console.log(jq); }
jj++;
});
var rr = 0;
rz.forEach(function(r) {
if(r.sid == data.sid) { rz.splice(rr, 1); console.log(rz); }
rr++;
});
fn(data);
exists = true;
}
});
});
});
if(!exists) {
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.push({'sid': sid, 'interest': interest});
});
});
fn();
}
}

答案 0 :(得分:1)
这是一个更安全的版本,它使用向后for
循环遍历来避免在删除当前项时出现问题。
function joinQueue(sid, interests, fn) {
var exists = false;
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.forEach(function(data) {
if(data.interest == interest && !exists) {
var sid = data.sid;
var sliceItOff = function(arr) {
for (var i = arr.length - 1; i >= 0; i--) {
if(arr[i].sid == sid) {
arr.splice(i, 1);
}
}
};
sliceItOff(ai);
sliceItOff(jq);
sliceItOff(rz);
fn(data);
exists = true;
}
});
});
});
if(!exists) {
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.push({'sid': sid, 'interest': interest});
});
});
fn();
}
}
答案 1 :(得分:0)
[未测试]。如果不访问可测试代码(输入数据和其他一些变量缺失),很难确定它是否有任何区别。
最好避免在循环时向项目中添加或删除项目。最好是循环遍历数组的克隆而不是数组本身。尝试使用下面的代码,看看它是否有任何区别。
function joinQueue(sid, interests, fn) {
var exists = false;
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.forEach(function(data) {
if(data.interest == interest && !exists) {
var sid = data.sid;
var sliceItOff = function(arr) {
arr.slice(0).forEach(function(d, i) {
// [warning]. if more than one item meets the condition (d.sid == sid),
// then you are likely to remove an item at the wrong index.
// A better approach is to build a new array rather than modify the old one
if(d.sid == sid) { arr.splice(i, 1); console.log(arr); }
});
};
sliceItOff(ai);
sliceItOff(jq);
sliceItOff(rz);
fn(data);
exists = true;
}
});
});
});
if(!exists) {
interests.forEach(function(interest) {
interest = interest.toLowerCase();
getTable(interest.charAt(0), function(table) {
table.push({'sid': sid, 'interest': interest});
});
});
fn();
}
}