从范围内的数组中获取唯一值?

时间:2018-09-29 08:31:38

标签: javascript arrays unique indexof

我有一个数组,我需要返回值范围从a到b的新数组!我想返回无重复。我在下面编写了脚本,但是无法正常工作。

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];
let newArr = [];
let funcFilter = function(arr, a, b) {
  for(let i = 0; i< arr.length; i++) {
  if(arr[i] >= a && arr[i] <= b ) {
  if(arr.indexOf(arr[i]) !== -1)
   newArr.push(arr[i]);
}
}
return newArr;
}
console.log(funcFilter(arr, 3, 20))

6 个答案:

答案 0 :(得分:5)

Ypu需要检查newArr中的值,因此需要将arr.indexOf(arr[i]) !== -1更改为newArr.indexOf(arr[i]) == -1

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];
let newArr = [];
let funcFilter = function(arr, a, b) {
  for(let i = 0; i< arr.length; i++) {
    if(arr[i] >= a && arr[i] <= b ) {
       if(newArr.indexOf(arr[i]) == -1)
         newArr.push(arr[i]);
       }
   }
return newArr;
}
console.log(funcFilter(arr, 3, 20))

答案 1 :(得分:3)

您可以使用Array.filter来过滤符合条件的值。然后将其转换为Set以获取唯一值,最后使用spread syntax将其转换回数组。

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];
let funcFilter = function(arr, a, b) {
    return [...new Set(arr.filter(v => v >= a && v <= b))];
}
console.log(funcFilter(arr, 3, 20))

答案 2 :(得分:2)

您可以使用Set对象来获取唯一值,并使用filter()来过滤数组项;

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];

let funcFilter = (arr, start, end) => Array.from(new Set(arr))
                                           .filter((v) => (v >= start && v <=end));

console.log(funcFilter(arr, 3, 20));

答案 3 :(得分:1)

尝试使用Set,因为

  

Set对象使您可以存储任何类型的唯一值,无论   基本值或对象引用。

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];
let newArr = [];
let funcFilter = function(arr, a, b) {
  for(let i = 0; i< arr.length; i++) {
  if(arr[i] >= a && arr[i] <= b ) {
  if(arr.indexOf(arr[i]) !== -1)
   newArr.push(arr[i]);
}
}

return [...new Set(newArr)];
}
console.log(funcFilter(arr, 3, 20))

答案 4 :(得分:1)

您可以再次测试实际索引以排除更多相同值

if (arr.indexOf(arr[i]) === i) {
//                          ^

顺便说一句,您可以将newArr的声明移到函数内部。

var arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13],
    funcFilter = function(arr, a, b) {
        var newArr = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] >= a && arr[i] <= b) {
                if (arr.indexOf(arr[i]) === i) { // take only the first found item
                    newArr.push(arr[i]);
                }
            }
        }
        return newArr;
    };
console.log(funcFilter(arr, 3, 20))

答案 5 :(得分:1)

let arr = [3, 9, 10, 23, 100, 100, 23, 4, 10, 13, 13];
const uniqueValue = Array.from(new Set(arr));

function getValueInTherange(array, a, b) {
  return array.filter(value => value >= a && value <= b - 1);
}

console.log(getValueInTherange(uniqueValue, 10, 50));