任务:仅保留数组中的唯一值。测试用例:

<script>
var ar1 = [1,1];
var ar2 = [];
ar2 = ar1.filter( function( x ) {
    return ( ar2.indexOf(x) < 0 ); // <== always returns true
})
console.log( ar2 ); // <== "Array [ 1, 1 ]" FAIL!
</script>


问题:在filter()回调中,结果数组似乎没有得到更新。这个对吗?又为什么呢? (我几乎确信我的代码中有一个错字,我看不到,因为从直觉上讲它应该起作用。因此,我一定会误解filter()。)

最佳答案

您的代码与此等效:

var ar1 = [1,1];
var ar2 = [];
var tmp = ar1.filter( function( x ) {
    return ( ar2.indexOf(x) < 0 ); // <== always returns true
})
ar2 = tmp;


我想向您展示ar2仅在ar1.filter完成后(即在迭代整个数组之后)才用新值更新。因此,“总是返回true”是预期的行为。

要解决您的任务,您必须执行以下操作:

var ar1 = [1,1];
var ar2 = [];
for (let x of ar1) {
    if (ar2.indexOf(x) < 0) {
        ar2.push(x);
    }
}


因此,这里我们遍历数组,检查该项目是否已在ar2中显示,并立即推送该项目,以便ar2在所有迭代中始终是最新的。

(警告:示例中使用ES6语法)

09-17 19:52