我将2个数组传递给函数,并希望将特定条目从一个数组移动到另一个数组。 moveDatum函数本身使用underscorejs的方法拒绝和过滤。我的问题是,原始数组没有改变,好像我是将数组作为值而不是作为引用传递。特定条目被正确移动,但正如我所说,效果只是本地的。我需要改变什么才能使原始阵列发生变化?
调用该函数:
this.moveDatum(sourceArr, targetArr, id)
功能本身:
function moveDatum(srcDS, trgDS, id) {
var ds = _(srcDS).filter(function(el) {
return el.uid === uid;
});
srcDS = _(srcDS).reject(function(el) {
return el.uid === uid;
});
trgDS.push(ds[0]);
return this;
}
感谢您的帮助
答案 0 :(得分:3)
正如评论中所提到的,您正在指定srcDS
来引用.reject()
返回的新数组,从而丢失对最初从函数外部传入的数组的引用。
您需要直接在原始数组上执行数组操作,可能是这样的:
function moveDatum(srcDS, trgDS, id) {
var ds;
for (var i = srcDS.length - 1; i >= 0; i--) {
if (srcDS[i].uid === id) {
ds = srcDS[i];
srcDS.splice(i,1);
}
}
trgDS.push(ds);
return this;
}
我已经设置循环向后移动,这样当.splice()
从数组中删除项目时,您不必担心循环索引i
不同步。向后循环还意味着ds
最终引用匹配的srcDS
中的第一个元素,这是我假设您打算的,因为您的原始代码有trgDS.push(ds[0])
。
如果您碰巧知道数组只会包含一个匹配项,那么当然前进或后退并不重要,您可以在break
内添加if
因为一旦你有匹配就没有意义继续循环。
(另外我认为你输错了,你正在测试=== uid
而不是=== id
。)
答案 1 :(得分:2)
复制每个匹配项,然后使用修改 Arrays 的方法删除它,例如splice
。
function moveDatum(srcDS, trgDS, id) { // you pass an `id`, not `uid`?
var i;
for (i = 0; i < srcDS.length; ++i) {
if (srcDS[i].uid === uid) {
trgDS.push(srcDS[i]);
srcDS.splice(i, 1);
// optionally break here for just the first
i--; // remember; decrement `i` because we need to re-check the same
// index now that the length has changed
}
}
return this;
}