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

Get unique values from array within a range?

我有一个数组,我需要 return 新数组,其值在范围(从 a 到 b)内,但是!我想要 return 没有重复。我写了下面的脚本,但它不能正常工作。

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))

您需要检查 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))

您可以使用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));

尝试 Set 因为

Set object lets you store unique values of any type, whether primitive values or object references.

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))

您可以使用 Array.filter to filter the values that match the criteria. Then convert into Set for unique values and finally use 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))

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

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))

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));