Напишите функцию, которая принимает один параметр — массив чисел. Функция должна возвращать объект с тремя ключами: lessThanTen, equalToTen и GreaterThanTen. Значения должны представлять количество элементов массива меньше, равно или больше десяти соответственно.

Вот моя последняя попытка:

function objTen(arr) {
  // YOUR CODE HERE
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < 10) {
      let lessThanTen = arr[i];
      return {lessThanTen: lessThanTen};
    } if (arr[i] === 10){
      let equalToTen = arr[i];
      return {equalToTen: equalToTen};
    } else {
      let greaterThanTen = arr[i];
      return {greaterThanTen: greaterThanTen};
    }
  }
}


module.exports = objTen;

Получено сообщение об ошибке: objTen 1) Возвращает объект с соответствующими значениями (1). 2) Возвращает объект с соответствующими значениями (2). 3) Возвращает объект с соответствующими значениями (3).

0 проходит (7 мс) 3 не проходит

  1. objTen Возвращает объект с соответствующими значениями (1).:

    AssertionError: ожидается, что {lessThanTen: 1} будет глубоко равно {Object (lessThanTen, equalToTen, ...)}

    • ожидаемый - фактический

    {

    • "меньше десяти": 1
    • "equalToTen": 3
    • "больше чем десять": 1
    • "меньше десяти": 2

    в контексте. (.guides/secure/test8.8.1.js:6:51) в processImmediate (внутренний/timers.js:439:21)

  2. objTen Возвращает объект с соответствующими значениями (2).:

    AssertionError: ожидается, что {greatThanTen: 23} будет глубоко равно {Object (lessThanTen, equalToTen, ...)}

    • ожидаемый - фактический

    {

    • "больше чем десять": 23
    • "equalToTen": 2
    • "больше чем десять": 3
    • "меньше десяти": 2

    в контексте. (.guides/secure/test8.8.1.js:13:55) в processImmediate (внутренний/timers.js:439:21)

  3. objTen Возвращает объект с соответствующими значениями (3).:

    AssertionError: ожидается, что {greatThanTen: 67} будет глубоко равно {Object (lessThanTen, equalToTen, ...)}

    • ожидаемый - фактический

    {

    • "больше чем десять": 67
    • "equalToTen": 2
    • "больше чем десять": 2
    • "меньшедесяти": 3

    в контексте. (.guides/secure/test8.8.1.js:20:55) в processImmediate (внутренний/timers.js:439:21)

Я пробовал использовать вложенные циклы, но это не сработало. Я пробовал помещать переменные после строки цикла for и перед операторами if, но это тоже не сработало.

0
Shannon Rachal 21 Янв 2022 в 18:21
1
Цель здесь состоит в том, чтобы «подсчитать» количество элементов массива, которые равны lessThanTen (equalToTen, GreaterThanTen); однако в let lessThanTen = arr[i]; код фактически присваивает конкретному элементу массива (по индексу i) значение lessThanTen. Вместо этого он должен увеличивать счетчик.
 – 
jsN00b
21 Янв 2022 в 19:14
Ой. Из сообщения об ошибке я подумал, что он должен возвращать фактические числа, которые меньше десяти рядом с этим ключом, равные рядом с этим ключом и те, которые больше рядом с этим ключом. Пример: lessThanTen: 4,1,0 equalToTen: 10 greatThanTen: 21, 30, 12
 – 
Shannon Rachal
21 Янв 2022 в 19:24

3 ответа

Что-то не так с вашим кодом:

  1. Когда вы делаете return {lessTanTen: someNumber}, вы возвращаетесь из функции, поэтому ваша функция не вернет объект с тремя разными ключами, но вернется на первой итерации вашего цикла for.

  2. Переменная, которую вы назначаете lessThanTen, — это не количество элементов меньше 10, а сам элемент, когда вы делаете let lessThanTen = elements[i]

У вас есть 2 решения:

Во-первых, если вы хотите продолжать использовать цикл:

function objTen(arr) {
  let lessThanTen = 0, equalToTen = 0, greaterThanTen = 0;
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < 10) {
      lessThanTen += 1;
    } if (arr[i] === 10){
      equalToTen += 1
    } else {
      greaterThanTen += 1;
    }
  }
  return {
    lessThanTen: lessThanTen,
    equalToTen: equalToTen,
    greaterThanTen: greaterThanTen
  }
}

Существует также второй способ сделать это с помощью метода reduce():

function objTen(arr) {
  return arr.reduce((accumulator, current)=> {
    if (current < 10) {
    return ({
      ...accumulator,
      lessThanTen: accumulator.lessThanTen + 1
    })
    } else if (current == 10) {
      return ({
        ...accumulator,
        equalToTen: accumulator.equalToTen + 1
      })
    } else {
      return ({
        ...accumulator,
        greaterThanTen: accumulator.greaterThanTen + 1
      })
    }
  }, {lessThanTen: 0, equalToTen: 0,  greaterThanTen: 0})
}

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

1
jeremynac 21 Янв 2022 в 18:46

Это событие будет работать с другим числом, но по умолчанию будет 10:

const getObject = (arr = [], num = 10) => {
  return arr.reduce((acc, curr) => {
    if (curr < num) acc.less += 1;
    if (curr === num) acc.equal += 1;
    if (curr > num) acc.greater += 1;
    return acc;
  }, { less: 0, equal: 0, greater: 0 })
}

console.log(getObject([8,9,10,12,13,14]))

// { less: 2, equal: 1, greater: 3 }
0
maxpsz 21 Янв 2022 в 18:54

Одно возможное решение/реализация:

const objTen = (arr = [10, 10, 8, 8, 12, 13, 7, 4, 10, 33]) => (
    arr.reduce((f, i) => ({...f, ...(
    typeof i === 'number'
    ? i < 10
      ? { lessThanTen : (f.lessThanTen || 0) + 1}
      : i === 10
        ? { equalToTen: (f.equalToTen || 0) + 1}
        : { greaterThanTen : (f.greaterThanTen || 0) + 1}
    : { notAnumber : (f.notAnumber || 0) + 1}
  )}) , {})
);

Объяснение

  1. Используйте reduce для перебора каждого элемента во входном массиве.
  2. В качестве простой меры предосторожности убедитесь, что ввод является числом (а если это не так, просто учтите его как notAnumber
  3. Проверьте, меньше ли элемент 10, равен 10 или больше 10.
  4. Соответственно обновить соответствующий счетчик

Если читателю интересно, он может узнать о ... (оператор расширения), ? : (тернарный оператор). The: (f.lessThanTen || 0), либо получит количество элементов, ранее подсчитанных как lessThanTen, либо (||) ноль. || гарантирует, что если lessThanTen имеет значение null или не определено, то будет выбрано 0. Таким образом, при первой обработке элемента lessThanTen он будет считаться как 0 + 1 (т.е. 1). И когда элемент массива lessThanTen обрабатывается во второй раз, он будет считаться как 1 + 1 (т. е. 2). Если это поможет, мы также можем изучить использование оператора ??.

Фрагмент кода

const objTen = (arr = [10, 10, 8, 8, 12, 13, 7, 4, 10, 33]) => (
  arr.reduce((f, i) => ({ ...f,
    ...(
      typeof i === 'number' ?
      i < 10 ?
      {
        lessThanTen: (f.lessThanTen || 0) + 1
      } :
      i === 10 ?
      {
        equalToTen: (f.equalToTen || 0) + 1
      } :
      {
        greaterThanTen: (f.greaterThanTen || 0) + 1
      } :
      {
        notAnumber: (f.notAnumber || 0) + 1
      }
    )
  }), {})
);


console.log('default-array: [10, 10, 8, 8, 12, 13, 7, 4, 10, 33]\n', objTen());
console.log('array: [0, -1, 10, 11]\n', objTen([0, -1, 10, 11]));
console.log("['asdf', 10, 9]\n", objTen(['asdf', 10, 9]));
0
jsN00b 21 Янв 2022 в 19:17