任务:仅保留数组中的唯一值。测试用例:
<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语法)