Javascript 基于输入数组的转换值从输入数组中查找唯一值

Javascript 基于输入数组的转换值从输入数组中查找唯一值,javascript,underscore.js,Javascript,Underscore.js,在过去的几个小时里,我一直在试图找出这个问题的解决方案,但我甚至一开始都不理解这个问题 问题是:“如果迭代器作为输入提供,则应根据转换后的值从输入数组返回所有唯一值” 测试代码是 // Note: The isSorted input parameter has absolutely no impact on functionality of this test. // The isSorted input parameter can be safel

在过去的几个小时里,我一直在试图找出这个问题的解决方案,但我甚至一开始都不理解这个问题

问题是:“如果迭代器作为输入提供,则应根据转换后的值从输入数组返回所有唯一值”

测试代码是

        // Note: The isSorted input parameter has absolutely no impact on functionality of this test.
        //       The isSorted input parameter can be safely ignored in your solution!

        var numbers = [1, 2, 1, 3, 1, 4];
        var otherNumbers = [11.2, 11.9, 12.4, 12.6];

        var isOne = function(value) { return value === 1; };
        var roundNumber = function(number) { return Math.round(number); };

        expect(_.uniq(numbers, false, isOne)).to.eql([1, 2]);
        expect(_.uniq(otherNumbers, true, roundNumber)).to.eql([11.2, 11.9, 12.6]);
      });
我的代码:

``` _.uniq = function(array, isSorted, iterator) {

      var transformed = [];
      
      for (var j = 0; j < array.length; j++) {
        if (iterator(array[j])) {
          transformed.push(array[j]);
        }
      }
      return transformed;
  };
`uniq=函数(数组、isSorted、迭代器){
var=[];
对于(var j=0;j

当我返回时,我得到[1,1,1]作为我应该得到[1,2]的答案。想知道为什么吗?

首先,您必须确定从迭代对象返回的值是否唯一。其次,您必须只返回这种情况下的值。第三,必须返回原始集合中的值,而不是转换后获得的值。让我们对这两个例子进行分析

var numbers = [1, 2, 1, 3, 1, 4];
var isOne = function(value) { return value === 1; };
expect(_.uniq(numbers, false, isOne)).to.eql([1, 2]);
isOne
返回的值对应于
数字
,它们是
[真、假、真、假、真、假]
。其中唯一的值是
true
false
。与这些唯一值的第一个实例相对应的原始值分别为
1
2
。这就是为什么需要返回
[1,2]

var otherNumbers = [11.2, 11.9, 12.4, 12.6];
var roundNumber = function(number) { return Math.round(number); };
expect(_.uniq(otherNumbers, true, roundNumber)).to.eql([11.2, 11.9, 12.6]);

roundNumber
返回的值对应于
othernumber
,它们是
[11,12,12,13]
。其中唯一的值是
11
12
13
。与这些唯一值的第一个实例相对应的原始值分别为
11.2
11.9
12.6
。这就是为什么您需要返回
[11.2,11.9,12.6]

我支持您,因为我不理解您的期望。以我阅读文本的方式,我认为这个期望应该是:
expect(q.uniq(number,false,isOne)).to.eql([2,3,4])
因为[2,3,4]是应用isOne时计算为false的唯一值列表。您应该查找
迭代器(数组[j])
的唯一值。相反,您只是检查
迭代器(array[j])
是否为真。您需要修改您的条件,以查看它是否是一个新的、唯一的值,而不仅仅是truthy。@DemiPixel您同意这种期望似乎不正确吗?@ruby_newbie不是真的,第一个返回布尔值只是误导。您可以看到下一个返回一个四舍五入的数字。第一个返回true的输入是1。返回false的第一个输入是2。由于其他所有内容都不是唯一的(只有true或false),它将返回
[1,2]
@DemiPixel,所以我只需执行以下操作:transformed.push(迭代器(数组[j])?而不是if语句?当我现在这样做时,我转换的数组是[真,假,真,假,真,假]?