Я учусь программировать и работаю над головоломкой Hack Reactor (см. Ниже). Я не понимаю, почему другая часть моего функционального блока не работает. Может кто-то указать мне верное направление?
Write a function called
getElementsThatEqual10AtProperty.Given an object and a key,
getElementsThatEqual10AtPropertyreturns 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'))



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте только 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);
}
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'));Этот код определенно лучше, Бертран. Спасибо, что посмотрели на мою проблему и указали лучшее решение. Это мне очень помогает.
Кажется, я могу принять только один ответ. Я думаю, что для целей обучения ответ Сабит немного лучше подходит. Тем не менее, я ценю ваши отзывы.
ОК. Не заметил :) Без проблем
Ваша проблема в том, что вы устанавливаете obj.key вместо obj[key] в части else вашей функции.
Спасибо, Лоренц, это абсолютно верно. Я понимаю, что делал эту ошибку раньше.
Это не имеет никакого отношения к проблеме. Он просто меняет значение obj.key на возвращаемый массив (однако, это может быть нежелательным поведением).
Отфильтруйте массив:
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)
Спасибо за отзыв, Дэн. Я просмотрел все предложения и многому научился. Наконец, я остановился на упрощении моей первоначальной мысли, на которую указал мне Сабит. Я отредактировал свой пост и закрыл вопрос. Очень признателен за все отзывы.
Сабит, спасибо. Это действительно решило мою ошибку и оставалось как можно ближе к моему первоначальному мышлению. Я ценю альтернативное решение, которое лучше и помогает мне лучше обдумать проблему.