【问题标题】:Get unique values from array within a range?从范围内的数组中获取唯一值?
【发布时间】:2018-09-29 08:31:38
【问题描述】:

我有一个数组,我需要返回值在范围内(从 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))

【问题讨论】:

标签: javascript arrays unique indexof


【解决方案1】:

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

【讨论】:

  • 是的,我做到了。
  • 这是一个很好的答案
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 值在范围内(从 a 到 b)的新数组
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多