Проверка наличия в обьекте свойства, прочитанного из prompt
есть вот такая задача:
Создайте ассоциативный массив person, описывающий персону, с произвольным количеством произвольных полей. С помощью оператора in или typeof проверьте наличие в объекте свойства, прочитанного из prompt, и выведите его на экран. Если свойства нет, то добавляйте его в объект со значением, которое также запрашивается из prompt. Ассоциативный массив создала: var person={ name:"John", age:"26", salary:"1000$", } Не понимаю как сделать дальше. Помогите и обьясните |
<div> Джон </div> <button id="spp">Показать свойство пользователя</button> <script> var person= { name:"John", age:"26", salary:"1000$", } document.querySelector('#spp').addEventListener('click', function() { var property = prompt('Введите нужное Вам свойство'); if (property in person) { // typeof person[property] !== 'undefined' alert(person[property]); } else { person[property] = prompt('Такого свойства еще нет. Укажите значения свойства ' + property + ' у Джона'); alert('Свойство ' + property + ' установлено в значение ' + person[property] + ' у Джона.'); } }); </script> |
спасибо)
Уже решила также)) Но есть другой вопрос,по другой задачке Создайте смешанный массив, например [1, 2, 3, 'a', 'b', 'c', '4', '5', '6']. Посчитайте сумму всех его чисел, включая строковые числа, исключая буквы. Выведите сумму в alert. как можно посчитать эти числа со строками,не учитиваю буквы? Учу JS только 3-ю неделю. есть моменты,которые не доходят как сделать) |
function isNumeric(value) { // ф-ия возвращает true или false, в зависимости от входящего значения, если аргумент приводится к числу, то true, иначе false var num = Number(value); // приводим к числу, Number('5') === 5 return !Number.isNaN(num) && // Number('abs') is NaN Number.isFinite(num) && // num !== Infinity && num !== -Infinity value.constructor !== Array; // если входящий параметр массив [5], то, из-за правил приведения типов в js Number([5]) === 5, т.к. [5].toString() === '5', Number('5') === 5 } arr .filter(value => isNumeric(value)) // получаем массив, где предикат isNumeric вернул true .reduce((agg, value) => agg + Number(value), 0); // складываем все значения отфильтрованного массива // то же, что и выше только в "классическом" виде, отработает быстрее, т.к. мы один раз пройдемся по массиву, вместо двух // код выше можно переписать, убрав filter и добавив проверку в callback функцию reduce для скорости var agg = 0; for(const value of arr) { if(isNumeric(value)) agg += Number(value); } |
А можете объяснить пожалуйста как оно работает?)
|
EmperioAf. можно еще быстрей и через тернарный без функции
var arr = [1, 2, 3, 'a', 'b', 'c', '4', '5', '6'], sum = arr.reduce((sum, el) => sum+(el=+el?+el:0)); alert(sum); |
j0hnik,
Number.isFinite(+'Infinity' || 0) === false; Number.isFinite(+Infinity || 0) === false; |
Цитата:
|
Что лишние?
Посчитайте своим способом массивы: [1, 2, 3, 'a', 'b', 'c', 'Infinity', -Infinity] [1, 2, 3, [4]] |
Цитата:
[1, 2, 3, [4]] // 10 alert(-Infinity + Infinity); |
что вы хотите увидеть при таких значениях массива?
[1, 2, 3, 'a', 'b', 'c', 'Infinity', -Infinity] |
Спасибо)
|
(el=+el?+el:0)
А можете мне обьяснить это выражение, пожалуйста. Я правильно понимаю,что здесь используется условный оператор? |
Цитата:
Этот пример тогда не работает. Как можно это решить? |
Reduce принимает 2 аргумента, первый - callback ф-ия, второй initialValue.
Ну и если выбрали унарный оператор, то логичнее выглядит так. arr.reduce((sum, el) => sum + (+el || 0), 0) |
Цитата:
пример: +'5' -приведение строки к числу. // 5 +'с' -к числу не приведется . // NaN правильнее наверное будет так: var arr = ['1', '2', true, 's'], sum = arr.reduce((sum, el) => +sum+(el=el!==true?+el?+el:0:0)); alert(sum); потому что унарный из true делает единицу |
Помогите пожалуйста еще с вот этой задачкой
https://javascript.ru/forum/showthre...168#post458168 |
Часовой пояс GMT +3, время: 09:04. |