Vanilla Javascript数组中的唯一数字,具有reduce和find

时间:2017-01-09 14:37:58

标签: javascript

我正在尝试使用reduce和find helper编写一个数组函数,返回一个唯一数字数组。

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  array.reduce((uniqueArray, number) => {
    if (uniqueArray.indexOf(find(array.number))) {
      uniqueArray.push(array.number);
    }
    return uniqueArray;
  }, []);
}
console.log(unique(numbers));
// undefined 
// undefined

运行此代码时,我得到了

  

未定义

在浏览器Javascript控制台中

两次。

4 个答案:

答案 0 :(得分:3)

以前的答案解释了错误的原因。所以我只是使用Array#filter方法添加备用方法。

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  return array.filter(function(v, i, arr) {
    // compare index with first element index
    return i == arr.indexOf(v);
  })
}
console.log(unique(numbers));

使用ES6箭头功能。

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  return array.filter((v, i, arr) => i == arr.indexOf(v))
}
console.log(unique(numbers));

UPDATE:使用引用对象而不是检查索引。

var numbers = [1, 1, 2, 3, 4, 4],
  ref = {};


function unique(array) {
  return array.filter(function(v) {
    if (!(v in ref)) {
      ref[v] = true;
      return true;
    }
    return false;
  })
}
console.log(unique(numbers));

答案 1 :(得分:2)

您需要退货声明。

return array.reduce((uniqueArray // ...
// ^^^

使用Array.indexOf

更好的查找方法



function unique(array) {
    return array.reduce((uniqueArray, number) => {
        if (uniqueArray.indexOf(number) === -1) {
            uniqueArray.push(number);
        }
        return uniqueArray;
    }, []);
}

var numbers = [1, 1, 2, 3, 4, 4];
console.log(unique(numbers));




现在使用Setspread syntax ...收集新数组中的项目。



function unique(array) {
    return [... new Set(array)];
}

var numbers = [1, 1, 2, 3, 4, 4];
console.log(unique(numbers));




答案 2 :(得分:2)

你几乎没有错误。首先,您需要从函数中返回值,并检查元素是否已经在uniqueArray中,您可以使用indexOf() == -1

var numbers = [1, 1, 2, 3, 4, 4];

function unique(array) {
  return array.reduce((uniqueArray, number) => {
    if (uniqueArray.indexOf(number) == -1) uniqueArray.push(number)
    return uniqueArray;
  }, []);
}
console.log(unique(numbers));

使用ES6 / 7,您可以使用includes()和箭头功能。

var numbers = [1, 1, 2, 3, 4, 4];

function unique(arr) {
  return arr.reduce((r, n) => (!r.includes(n) ? r.push(n) : 1) && r , []);
}
console.log(unique(numbers));

答案 3 :(得分:0)

您始终可以使用Array.includes

function SillyFunctionName(array) {
    "use strict";

    var uniqueArray = [];

    for (var i = 0; i < array.length; i++) {
        if (uniqueArray.includes(array[i])) {
            break;
        } else {
            uniqueArray.push(array[i]);
        }
    }

    return uniqueArray;
}