更改数组传递给函数

时间:2013-08-24 13:06:26

标签: javascript jquery underscore.js

我将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;
}

感谢您的帮助

2 个答案:

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