функция оператора распространения в javascript

#javascript

#javascript

Вопрос:

У меня есть некоторые проблемы с этой функцией, которая имеет FirstValue(число), LastValue(число) и dataArray(массив).Функция имеет проверку firstvalue < LastValue, а количество записей в массиве данных должно быть больше 5. Функция будет искать данные в массиве данных, которые имеют значение между firstvalue и LastValue, сортировать результаты поиска и отображать их на консоли.

Это то, что я получил до сих пор. Я раньше не использовал Javascript, поэтому буду признателен за любую помощь.

 let result ="";
function valueSelection(firstValue, lastValue, ...dataArray){
    if(firstValue > lastValue) {
        console.log("The last value must be greater than first value");
        if(dataArray.length < 5) {
            console.log("Numbers in dataArray must be more than 5");
          } else {
            console.log(result);
          }
      } else {
          console.log(result);
      }
    }
valueSelection(5, 20 , [2, 25, 4, 14, 17, 30, 8]) 
  

результат, который я хочу, это:
[8, 14, 17]

Ошибка обработки :

Выбор значений(15, 3 , [2, 25, 4, 14, 17, 30, 8])

вывод: "The last value must be greater than first value"

Выбор значений(4, 17 , [2, 25, 4])

вывод: Numbers in dataArray must be more than 5

Комментарии:

1. Здесь указан используемый вами браузер: caniuse.com/?search=spread operator

2. Кроме того, вы говорите, что желаемый результат равен [8, 14, 17] . Как вы к этому пришли? Ваш ввод для FirstValue равен 5, а LastValue равно 20. Оператор if имеет значение false, поэтому он переходит к console.log(результат). Значение для результата — это просто пустая строка, как показано в самой первой строке вашего кода. Вы ожидали где-то изменить значение результата?

3. Каков процесс получения [8, 14, 17] ?

4. @kojow7 я думаю, что он просит помочь разобраться с остальной частью алгоритма. Я думаю, что он получил [8, 14, 17], поскольку он находится между 5 и 20.

5. спасибо, ребята, за то, что выяснили, это сделано

Ответ №1:

Взгляните на документацию MDN для синтаксиса распространения, я не думаю, что вам нужно использовать ее для этого вопроса:

 function valueSelection(firstValue, lastValue, dataArray) {
    if (firstValue > lastValue) {
        console.error("lastValue must be greater than firstValue");
    }
    else if (dataArray.length < 5) {
        console.error("dataArray must contain 5 or more numbers");
    } else {
        const result = dataArray.filter(x => x >= firstValue amp;amp; x <= lastValue);
        console.log(result.sort((a, b) => a - b));
    }
}

valueSelection(5, 20, [2, 25, 4, 14, 17, 30, 8]);
valueSelection(15, 3, [2, 25, 4, 14, 17, 30, 8]);
valueSelection(4, 17, [2, 25, 4]);  

Другие соответствующие ссылки:

Ответ №2:

Вам вообще не требуется операция распространения.

Я также улучшил логику, чтобы она работала более эффективно 🙂

 function valueSelection(firstValue, lastValue, dataArray){
    let result = []
    console.log(dataArray.length)
    if(firstValue < lastValue amp;amp; dataArray.length > 5 ) {
        result = dataArray.filter(data => data > firstValue amp;amp; data < lastValue )
        console.log(result.reverse())
        return result.reverse()
      } else {
          console.log("The last value must be greater than first value and Numbers in dataArray must be more than 5" );
      }
    }
valueSelection(5, 20 , [2, 25, 4, 14, 17, 30, 8]) 
  

Ответ №3:

Вам не нужен оператор распространения, если вы передадите массив в качестве параметра.

При использовании «… dataArray» происходит то, что все параметры, начинающиеся с позиции 2, будут добавлены в массив в качестве элемента.

Итак, в вашем примере вашим третьим параметром является массив [2, 25, 4, 14, 17, 30, 8] и после этого у тебя больше ничего не будет.

в результате чего

 let result ="";
function valueSelection(firstValue, lastValue, ...dataArray){
    //firstValue = 4, lastValue = 17, dataArray [ [2, 25, 4, 14, 17, 30, 8]] which is, an array where the first element is the array you sent as param
    if(firstValue > lastValue) {
        console.log("The last value must be greater than first value");
        if(dataArray.length < 5) {
            console.log("Numbers in dataArray must be more than 5");
          } else {
            console.log(result);
          }
      } else {
          console.log(result);
      }
    }
valueSelection(5, 20 , [2, 25, 4, 14, 17, 30, 8]) 
  

если вы удалите оператор распространения, код будет работать так, как вы хотите.

Использование …dataArray имело бы смысл, если бы вместо отправки массива в качестве третьего параметра вы отправляли кучу одиночных чисел, как в этом примере

 let result ="";
function valueSelection(firstValue, lastValue, ...dataArray){
    //firstValue = 4, lastValue = 17, dataArray [2, 25, 4, 14, 17, 30, 8] an array made of all the parameters sent starting for the third one
    if(firstValue > lastValue) {
        console.log("The last value must be greater than first value");
        if(dataArray.length < 5) {
            console.log("Numbers in dataArray must be more than 5");
          } else {
            console.log(result);
          }
      } else {
          console.log(result);
      }
    }
valueSelection(5, 20 , 2, 25, 4, 14, 17, 30, 8) 
  

Ответ №4:

Пара ошибок в вашем коде. Кроме того, вы не объясняете, как вы получаете результат, поэтому я предполагаю, что значения должны быть между firstValue и lastValue . Вы также должны throw обнаруживать ошибки и перехватывать их в try-catch .

 function valueSelection(firstValue, lastValue, dataArray) {
  if (firstValue > lastValue) return "The last value must be greater than first value";
  if (dataArray.length < 5) return "Numbers in dataArray must be more than 5";
  let result = [];
  for (let i = 0; i < dataArray.length; i  ) {
    const v = dataArray[i];
    if (v > firstValue amp;amp; v < lastValue) result.push(v);
  }
  return result.sort((a, b) => a - b);
}

console.log(valueSelection(5, 20, [2, 25, 4, 14, 17, 30, 8]));

//the output I want is: [8, 14, 17] 

//HandlingError :

console.log(valueSelection(15, 3, [2, 25, 4, 14, 17, 30, 8]));

//output:"The last value must be greater than first value"

console.log(valueSelection(4, 17, [2, 25, 4]));

//output: Numbers in dataArray must be more than 5