NodeJS arr.splice()不从数组中删除

时间:2015-09-09 04:00:06

标签: javascript arrays node.js

使用以下代码,我应该检查数组(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();
	}
}




2 个答案:

答案 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();
	}
}