Получить уникальные значения из массива в пределах диапазона? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть массив, мне нужно вернуть новый массив со значениями в диапазоне (от 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 голосов
/ 29 сентября 2018

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));
0 голосов
/ 29 сентября 2018

Вы можете просто протестировать фактический индекс для исключения большего количества того же значения

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))
0 голосов
/ 29 сентября 2018

Вы можете использовать Array.filter для фильтрации значений, соответствующих критериям.Затем преобразуйте в Установите для уникальных значений и, наконец, используйте Синтаксис распространения , чтобы преобразовать его обратно в массив.

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))
0 голосов
/ 29 сентября 2018

Попробуйте с помощью Установить , поскольку объект

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))
0 голосов
/ 29 сентября 2018

Вы можете использовать Set Object для получения уникальных значений и 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));
0 голосов
/ 29 сентября 2018

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