微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据转换后的值从输入数组中查找唯一值

如何解决根据转换后的值从输入数组中查找唯一值

在过去的几个小时里,我一直试图为这个问题找出解决方案,但我什至不明白这个问题的开始。

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

测试代码

        // 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,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,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;
  };

当我返回转换时,我得到 [1,1] 作为我应该得到 [1,2] 的答案。任何想法为什么?

解决方法

首先要判断迭代器返回的值是否唯一。其次,您必须仅返回属于这种情况的值。第三,对于这种情况,您必须返回原始集合中的值,而不是转换后获得的值。让我们对这两个示例进行一遍。

var numbers = [1,2,1,3,4];
var isOne = function(value) { return value === 1; };
expect(_.uniq(numbers,false,isOne)).to.eql([1,2]);

isOne 返回的值,对应于 numbers,为 [true,true,false]。其中唯一值为truefalse与这些唯一值的第一个实例对应的原始值分别是 12。这就是您需要返回 [1,2] 的原因。

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

roundNumber 返回的值,对应于 otherNumbers,为 [11,12,13]。其中唯一值为111213与这些唯一值的第一个实例对应的原始值分别是 11.211.912.6。这就是您需要返回 [11.2,12.6] 的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。