Подозреваемая проблема с областью действия

Я учусь программировать и работаю над головоломкой Hack Reactor (см. Ниже). Я не понимаю, почему другая часть моего функционального блока не работает. Может кто-то указать мне верное направление?

Write a function called getElementsThatEqual10AtProperty.

Given an object and a key, getElementsThatEqual10AtProperty returns an array containing all the elements of the array located at the given key that are equal to ten.

Notes:

  • If the array is empty, it should return an empty array.
  • If the array contains no elements are equal to 10, it should return an empty array.
  • If the property at the given key is not an array, it should return an empty array.
  • If there is no property at the key, it should return an empty array.

Пример:

var obj = { key: [1000, 10, 50, 10] };
var output = getElementsThatEqual10AtProperty(obj, 'key'); 
console.info(output); // > --> [10, 10]

Мое решение:

var obj = {
  key: '[1000, 10, 50, 10]'
};

function getElementsThatEqual10AtProperty(obj, key) {
  if (typeof Array.isArray(obj[key])) {
    for (let key in obj) {
      tenArray = obj.key = obj[key].filter( element => element === 10);
    }
  } else {
    tenArray = obj.key = [];
  }
  return tenArray;
}

console.info(getElementsThatEqual10AtProperty(obj, 'key'))

Окончательное решение

var obj = {
  key: [1000, 10, 50, 10]
};

function getElementsThatEqual10AtProperty(obj, key) {
  if (Array.isArray(obj[key])) {
     tenArray = obj[key].filter( element => element === 10);
  } else {
    tenArray = [];
  }
  return tenArray;
}

console.info(getElementsThatEqual10AtProperty(obj, 'key'))
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
37
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Используйте только isArray для проверки массива, здесь нет необходимости в typeof.

var obj = {
  key: '[1000, 10, 50, 10]'
};
console.info(Array.isArray(obj.key)) // false
console.info(typeof Array.isArray(obj.key)) // 'boolean'
console.info(Boolean(typeof Array.isArray(obj.key))) // true

Массив со значением «ключ» следует объявлять без одинарных кавычек, иначе он будет рассматриваться как строка.

var obj = {
  key: [1000, 10, 50, 10]
};
console.info(Array.isArray(obj.key)) // true

Здесь нет необходимости в for ..in, так как ключ уже известен. Думаю, также не нужно изменять obj.key.

  if (Array.isArray(obj[key])) {
     tenArray = obj[key].filter( element => element === 10);
  }

Сабит, спасибо. Это действительно решило мою ошибку и оставалось как можно ближе к моему первоначальному мышлению. Я ценю альтернативное решение, которое лучше и помогает мне лучше обдумать проблему.

JP Douma 17.05.2018 13:21

Obj [key] объявляется в вашем коде не как массив, а как строка. Вы также можете сделать гораздо проще, чтобы удовлетворить ваши требования:

var obj = {
  key: [1000, 10, 50, 10]
};

function getElementsThatEqual10AtProperty(obj, key) {
  if (obj[key] && obj[key] instanceof Array) {
     return obj[key].filter( element => element === 10);
  }  
  return [];
}

console.info(getElementsThatEqual10AtProperty(obj, 'key'));

Этот код определенно лучше, Бертран. Спасибо, что посмотрели на мою проблему и указали лучшее решение. Это мне очень помогает.

JP Douma 17.05.2018 13:22

Кажется, я могу принять только один ответ. Я думаю, что для целей обучения ответ Сабит немного лучше подходит. Тем не менее, я ценю ваши отзывы.

JP Douma 17.05.2018 13:41

ОК. Не заметил :) Без проблем

Bertrand 17.05.2018 14:01

Ваша проблема в том, что вы устанавливаете obj.key вместо obj[key] в части else вашей функции.

Спасибо, Лоренц, это абсолютно верно. Я понимаю, что делал эту ошибку раньше.

JP Douma 17.05.2018 13:20

Это не имеет никакого отношения к проблеме. Он просто меняет значение obj.key на возвращаемый массив (однако, это может быть нежелательным поведением).

Bertrand 17.05.2018 13:40

Отфильтруйте массив:

var obj = {
  key: [1000, 10, 50, 10]
}

function getElementsThatEqual10AtProperty(obj, key) {
  var tens = []
  if (Array.isArray(obj[key])) {
    tens = obj[key].filter(function(el) {
      return (10 === el)
    })
  }
  return tens
}

var tensArray = getElementsThatEqual10AtProperty(obj, 'key')

console.info(tensArray)

Спасибо за отзыв, Дэн. Я просмотрел все предложения и многому научился. Наконец, я остановился на упрощении моей первоначальной мысли, на которую указал мне Сабит. Я отредактировал свой пост и закрыл вопрос. Очень признателен за все отзывы.

JP Douma 17.05.2018 14:00

Другие вопросы по теме