Ответы пользователя по тегу JavaScript
  • Есть ли простой способ найти конкретный элемент, если кликаешь на другой элемент?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Да, есть.

    Эти элементы должны быть связаны по смыслу. Тогда и будет способ из обработчика к одному элементу работать с другим элементом. Например, у них должна быть родительская связь. Или один должен следовать за другим. Или во время создания обработчика нужно передать в него индекс нужного элемента и т.д. Способов много. А самый элегантный зависит от конкретной задачи.

    Конкретно ваш код можно упростить, как минимум, до такого:
    Код
    let d = document, card = d.querySelectorAll(".card");
    var current = null;
    
    d.querySelectorAll(".btn").forEach(item => item.addEventListener("click", (e) => rotateCard(e)));
    
    function rotateCard(e) {
    	// Is there another way to find the item?
    	current = e.target.parentElement.parentElement;
    	current.style.transform = 'scale(2)';
    }

    Или можно учесть, что количество и порядок индексов одинаковый, и привязаться к нему. Тогда получится это:
    Код
    let d = document, card = d.querySelectorAll(".card");
    var current = null;
    
    d.querySelectorAll(".btn").forEach((item,j) => item.addEventListener("click", () => rotateCard(j)));
    
    function rotateCard(idx) {
    	// Is there another way to find the item?
    	current = card[idx];
    	current.style.transform = 'scale(2)';
    }
    Ответ написан
    3 комментария
  • Зачем писать tooltipElem = null;?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это оптимизация.
    Визуально разницы нет, но под капотом работает чуть быстрее.

    Когда событий сотни и тысячи (в небольшой промежуток времени), то оптимизация даёт более ощутимую разницу. В любом случае, лучше сразу писать правильно, чтобы потом не переписывать.
    Ответ написан
    Комментировать
  • JavaScript или Python - на чем проще написать игру?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Оба варианта так себе.
    Потому что это как бы не совсем игровые языки, не смотря на то, что при желании игру написать всё-таки можно на любом из них.

    На ум приходят два популярных хороших движка:
    1. Godot - там как бы Python, но не он. Там свой скриптовой язык, очень похожий на Python. Проблема здесь в том, что если буквально прикручивать Python, то это повлечет накладные расходы производительности. Так что если не хотите учить новый язык (а зря), то попробуйте Godot - сам движок учить всё равно придётся.
    2. Unity - там как бы был JavaScript, и в целом даже ещё есть. Но разработчики этого движка давно поняли, что это бесперспективняк, и стараются всячески уйти от поддержки Javascript. Рано или поздно они её выпилят в пользу C#, который гораздо лучше для игр. Да и то там, как и в случае с Godot, не совсем Javascript, а очень похожий язык, который в свое время нарекли Unityscript.

    Таким образом, C# - лучший выбор.

    Ещё можно рассмотреть Lua, как вариант, он идеально подходит для описания игровой логики и прост в освоении. Но движки с поддержкой Lua пока что уступают вышеперечисленным. Проще взять тот же Unity и прикрутить к нему MoonSharp, например, чтобы иметь возможность использовать Lua. Но только если это действительно нужно - например, для поддержки модификаций.
    Ответ написан
  • Почему в данном регулярном выражении ленивый квантификатор не учитывает кавычку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    let str = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
    let regexp = /<a href="[^"]*?" class="doc">/g;
    alert( str.match(regexp) );
    Ответ написан
    Комментировать
  • Как отфильтровать массив объектов в объекте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    for (let year in data) {
    	let cache = {};
    	data[year] = data[year].filter(e=>{
    		if (cache[e.number]) return false;
    		return cache[e.number] = true;
    	});
    }

    Точно не знаю, что для вас значит слово "красиво". Если это значит в одну строчку, то мне кажется, что красота здесь является спорным моментом. Лично я под красотой понимаю, прежде всего, понятный код (для тех, кто с ним не знаком). А это в первую очередь означает наличие комментариев или хотя бы осмысленное именование. И для простых примеров как-то странно эту красоту наводить.

    Ну а по скорости всё зависит от алгоритма и акцента на использовании нативных функций. Выбор алгоритма, в свою очередь, зависит от многих факторов, которые в вашем вопросе не обозначены. Так что привожу просто наиболее очевидный для меня алгоритм.
    Ответ написан
    1 комментарий
  • Почему i = undefiend. В Функции условие if, в условии цикл for?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что someLength меньше, чем num.
    Таким образом, цикл начинается с i = num, но не проходит первую проверку на i <= someLength, в итоге в цикле ноль итераций, в результате которых в массив ничего не добавляется.

    При этом i не равно undefined, оно равно именно num, но только в пределах цикла, который закончился сразу после того, как начался. А затем переменная i перестает существовать с точки зрения языка.

    К слову, если сделать someArr.push(undefined), то длина массива изменится. Так что в отсутствии работы цикла легко убедиться, проверив, что someArr.length === 0
    Ответ написан
  • Как найти баланс чисел в массиве?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Алгоритм такой. Все элементы помещаем в одну кучу (массив). Сортируем по убыванию. Дальше начинаем раскидывать по двум новым массивам. Параллельно считаем сумму каждого массива. Таким образом, раскладываем сначала большие числа, потом всё меньше и меньше. Каждый раз кладём новое число в тот массив, где сумма меньше.

    Очевидно, что последними будут идти самые маленькие числа, которые будут старательно минимизировать разницу в суммах. Доказать, что в итоге разница будет минимальна, я не могу (лень), но интуиция подсказывает, что это будет так.


    UPD:
    Такой алгоритм полного перебора
    function balance(arr1, arr2) {
      let all = arr1.concat(arr2);
    	//all.sort((a, b) => a - b); //Для исключения одинаковых.
    	let all_sum = all.reduce((a,b)=>a+b,0);
    	let len = all.length;
    	let cnt = Math.floor(len * 0.5);
    	let arr_result = new Array(cnt); //Массив выбранных индексов
    	let idx_begin = 0; //Начальная глубина перебора (индекс в arr_result)
    	let sum_begin = 0; //Начальная сумма частично перебранных элементов
    	
    	if (cnt === len * 0.5) { //Оптимизация
    		arr_result[0] = 0;
    		idx_begin = 1;
    		sum_begin = all[0];
    	}
    	
    	let min_diff = all_sum; //Присваиваем какое-то заведомо большое число.
    	let arr_answer; //Итоговый ответ
    	
    	//Проверяем следующий уровень глубины
    	//idx - глубина, sum - сумма всех элементов до этого
    	function check(idx, sum) { 
    		if (idx === cnt) { //Конец перебора. Проверяем, подходит ли.
    			let diff = Math.abs((all_sum - sum) - sum);
    			if (diff < min_diff) { //Подходит
    				min_diff = diff; //Запоминаем новый лучший результат.
    				arr_answer = arr_result.slice(); //Копируем
    			}
    			return;
    		}
    		//Иначе идем дальше вглубь на следующий уровень.
    		let start = idx === 0 ? 0 : arr_result[idx-1] + 1;
    		let max = len - cnt + idx;
    		for(let i = start; i <= max; i++){ //Ключевой цикл алгоритма
    			//if (i > start && all[i] === all[i-1]) continue;
    			arr_result[idx] = i;
    			check(idx+1, sum+all[i]); //Рекурсия
    		}
    	}
    	check(idx_begin,sum_begin); //Начать перебор. Поехали!
    	
    	arr1 = [];
    	arr2 = [];
    	
    	//Фасуем полученный ответ по массивам уже в виде значений.
    	let j = 0;
    	all.forEach((e,i)=>{
    		if (i === arr_answer[j]) {
    			arr1.push(e);
    			j++;
    		} else arr2.push(e);
    	});
    	
    	return {
    		arr1: arr1,
    		arr2: arr2,
    		sum1: arr1.reduce((a,b)=>a+b,0),
    		sum2: arr2.reduce((a,b)=>a+b,0),
    	}
    }
    
    var arr1 = [10, 300, 25, 75];
    var arr2 = [50, 125, 500, 10];
    balance(arr1, arr2);
    Ответ написан
  • Можно ли с помощью js удалить атрибут в элементе img?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно. Почему нет?
    spoiler
    Поиск не помог что ли? Или было лень искать? хм
    Ответ написан
    3 комментария
  • Как эффективно выбирать каждый n элемент массива?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Эффективно - только через создание второго индексного массива. При этом, очевидно, проигрыш по оперативной памяти, но не архи большой. Объекты передаются по ссылке, и строки примерно до 12 символов - тоже по ссылке.
    var arr = [1,2,3,4,5,6,7,8,9,10,11,12]; //Исходный массив
    //Формируем вспомогательный индексный массив
    var i = 0;
    var every_5 = arr.filter(e => (++i) % 5 === 0); 
    //Проверяем
    every_5[0]; //Пятый элемент
    every_5[1]; //Десятый элемент
    Ответ написан
    8 комментариев
  • Что означает return function?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Дело в том, что функция в языке JavaScript - это объект, то есть она является значением. Её можно запихнуть в переменную. А потом эту переменную можно вызывать, как функцию.

    Пример:
    var f = function() { alert(123) }; //записали в переменную f целую функцию.
    f(); //вызвали функцию в переменной.

    Можно даже пойти дальше по этой логике. Ведь alert - это тоже функция.
    var f = alert;
    f(123);

    В общем, надеюсь, логика понятна. Что касается вашего кода, то в нем из названия функции makeCounter очевидно, что она создаёт счетчик, то есть создает то, что умеет считать. То есть создает функцию. Вот и получается, что нужно вернуть функцию. Записать это можно по-разному, в том числе и в одну строчку, которая начинается с return function.

    Ниже в строке:
    let counter = makeCounter();
    Мы как раз создаём эту функцию. То есть функция помещается в переменную counter. И чтобы это произошло, функция makeCounter должна вернуть функцию в качестве значения. Это и происходит.
    Ответ написан
    3 комментария
  • Почему когда я использую set для добавления в массив, выдает ошибку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Причины разные могут быть.
    Например, где-то в коде у вас что-то типа такого:
    function Map(){}

    Можете сами убедиться, запустив в консоли данный код:
    Код
    var data = new Map();
    var get = "key1";
    data.set(get, 1);
    function Map(){}

    Или же можно так испортить:
    Код
    Map.prototype.set = 123;
    var data = new Map();
    var get = "key1";
    data.set(get, 1);

    В общем, ошибку искать нужно не в приведенном вами коде, а за его пределами.
    Ответ написан
    Комментировать
  • Как использовать переменную вне функции?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Скопировать ее в глобальную.
    Ответ написан
  • Как вывести текст из массива?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вывести можно так:
    let questions = [
        {
            text: '1. Как вывести текст из массива?',
            right: 2,
            answers: [
                'Спросить на Тостере',
                'Посмотреть в учебнике JavaScript', //Верный ответ
                'Спросить друга программиста',
            ],
        },
    ];
    console.log(questions[0].answers.join('; ')); //Вывод "строки answers"
    Ответ написан
    1 комментарий
  • Как оптимальнее реализовать поиск значений в json?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Через indexOf можно. Это самое оптимальное, что приходит в голову, т.е. самый прямой поиск "в лоб" без лишних вычислений. Оптимальнее только поиск без поиска, когда заранее известны индексы, откуда нужно брать значения.

    var json_str = `,{"name":"Adhi Kot","id":"379","nametype":"Valid","recclass":"EH4","mass":"4239","fall":"Fell","year":"1919-01-01T00:00:00.000","reclat":"32.100000","reclong":"71.800000","geolocation":{"type":"Point","coordinates":[71.8,32.1]}},{"name":"Adzhi-Bogdo (stone)","id":"390","nametype":"Valid","recclass":"LL3-6","mass":"910","fall":"Fell","year":"1949-01-01T00:00:00.000","reclat":"44.833330","reclong":"95.166670","geolocation":{"type":"Point","coordinates":[95.16667,44.83333]}}`;
    var i = 0;
    while((i=json_str.indexOf('"recclass":"',i))!==-1) {
    	i+=12;
    	let j = json_str.indexOf('"',i);
    	let val = json_str.substring(i,j);
    	console.log(val); //выводим очередное значение
    }
    Ответ написан
  • Как передать значение, изменённое onclick, из одной функции в другую?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Считайте, что то, что внутри onclick - это отдельный поток (хотя это не так, но так удобней). То есть это отдельная точка входа в скрипт. Таким образом, всё, что внутри onclick случится только в будущем и вы не можете брать оттуда значения здесь и сейчас. Вы можете использовать значения, полученные в будущем только в еще более далеком будущем.

    Таким образом, нужно менять логику построения вашего скрипта, его архитектуру. А именно, перестать хотеть невозможного, то есть хотеть использовать значения, которых пока еще нет.

    Код внутри onclick в момент клика становится главным, и использует остальные функции по своему усмотрению. Поиспользовал, и всё. Возможно, какой-то результат сохранил куда-то в глобальную переменную для друзей. То есть это как бы не вспомогательная функция, а главная.

    Как именно и что поменять, сложно сказать, потому что код абстрактный, и не ясно, что он делает. Был бы практический смысл, можно было бы переписать в соответствии с конкретной целью.
    Ответ написан
  • Можно ли читать с другого домена localStorage webStorage?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Напрямую нельзя. Это базовая безопасность браузера.

    Можно только договориться с владельцем другого домена, чтобы он вам пересылал информацию по другим каналам - в виде JSON или через URL и т.п..
    Ответ написан
    Комментировать
  • Встроенный браузер мобильно приложения VK не видит стили, как быть?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Спрашиваешь, как быть?
    Вот варианты:
    1) Забить болт. Пипл схавает.
    2) Не использовать стили вообще, тогда всё будет однообразно.
    3) Отделить некоторые стили от не некоторых, - это и будет решением.
    4) Отделить не все страницы от всех, - это и будет решением.
    5) Помолиться, чтобы эта магия испарилась.
    6) Сидеть в шоке и пялиться в экран, ожидая вразумительного ответа.
    7) Взять себя в руки и найти причину. Ты мужик или нет? Это задача даже не для программиста, с ней любой нормальный сис. админ справится.

    В общем, как видишь, однозначно ответить на вопрос нельзя. Любой из перечисленных вариантов является ответом, как быть в такой ситуации. Причем, это не ерунда какая-то, а реальные советы.
    Ответ написан
    Комментировать
  • Составление формулы для теории вероятности?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Однозначной формулы нет в данной задаче.
    Креативно может сделать геймдизайнер (точнее, балансер - подвид геймдизайнеров).

    В составлении формулы вам поможет такое понятие, как математическое ожидание.
    Ответ написан
  • Как записать массив в JSON?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    JSON.stringify(spisok)
    Ответ написан
    4 комментария
  • Как добавить 3 вариант JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var name = old ? 'productAir2' : ( bool ? 'productAir2w' : 'третий вариант');

    Примерно так. Нужно включить логику, чтобы понять, как в точности реализовать.
    А сейчас вечер, сами понимаете...
    Ответ написан