function treeToPlainList(tree, idPrefix = '') {
let list = [];
// Проходит по каждому элементу массива
tree.forEach((item, index) => {
// Добавляет к элементу свойство id
const itemForPlainList = {...item, id: idPrefix + (index + 1)};
// Удаляет из элемента свойство children
delete itemForPlainList.children;
// Добавляет элемент в итоговый массив
list.push(itemForPlainList);
if (item.children) {
// Добавляет в конец итогового массива элементы, которые возвращает функция treeToPlainList
list = [...list, ...treeToPlainList(item.children, idPrefix + (index + 1) + '.')];
}
});
return list;
}
const list = treeToPlainList(tree); // tree — изначальный массив, list — результат
objectManager.objects.getById(1).properties.balloonContentBody = 'Загружено (тут полезная информация)';
objectManager.objects.getById
может вернуть null
. Демо на CodePen.createMap
, переименовав переменную myMap
в map
. Туда же нужно поместить код для задания элементов управленияymaps.ready(function() {
// Создание карты и установка элементов управления
var map = new ymaps.Map(document.getElementById('map'), {
center: [42, 54],
zoom: 6,
controls: ['zoomControl', 'fullscreenControl'] // Полный список тут: https://tech.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/controls-docpage/#standard
});
// Добавление меток через ObjectManager
var objectManager = new ymaps.ObjectManager({
clusterize: true
});
map.geoObjects.add(objectManager);
$.ajax({
url: 'wp-content/themes/urbech-style/data.json'
}).done(function(data) {
objectManager.add(data);
})
});
/shop/
:if (window.location.pathname.indexOf('/shop/') >= 0)) {
alert('Работает');
}
if (window.location.pathname.match(/^\/shop(\/|$)/)) {
alert('Работает');
}
[100, 80, 60, 50, 40, 20, 10, 0].forEach(function(number) {
document.write('Число: <b>' + number + '</b><br>');
});
var deferred = $.ajax({ ... });
deferred.done(function(data) { /* Действие 1 */ });
deferred.done(function(data) { /* Действие 2 */ });
var masterCheckbox = document.querySelector('input[type="checkbox"][value="0"]');
var slaveCheckboxes = document.querySelectorAll('input[type="checkbox"]:not([value="0"])');
masterCheckbox.addEventListener('change', function() {
if (masterCheckbox.checked) {
// Галочка поставлена. Деактивируем остальные чекбоксы.
Array.prototype.forEach.call(slaveCheckboxes, function(checkbox) {
checkbox.checked = false;
checkbox.disabled = true;
});
} else {
// Галочка убрана. Активируем остальные чекбоксы.
Array.prototype.forEach.call(slaveCheckboxes, function(checkbox) {
checkbox.disabled = false;
});
}
});
var items = [
{
color: 'red',
size: 100
},
{
color: 'blue',
size: 70
}
// и так далее
]
items
и собрать те значения фильтра "размер", которые встречаются в элементах, которые подходят под фильтр цвета:var color = 'red';
var availableSizes = []; // Будет содержать список доступных размеров для красного цвета
items
// Отсеиваем элементы по фильтру цвета
.filter( function( item ) { return item.color === color; })
// Собираем значения фильтра размера для них
.forEach( function( item ) {
if ( availableSizes.indexOf( item.size ) === -1 )
availableSizes.indexOf.push( item.size );
});
items
и заново проделать с ним операцию, описанную выше. Не надо сохранять и использовать результат предыдущего запроса, надо работать только с начальным набором данных и тем, что ввёл пользователь, иначе сложность программы будет расти быстрее грибов после дождя. runCar
прямо во время вызова animate
, а не посылаете её вызываться по завершению анимации, потому что круглые скобки сразу после её названия вызывают её в тот же момент. Чтобы вызвать её с указанными аргументами по завершению анимации, сделайте так:function runCar(carNumber) {
$(".car").animate({$start,$speed, 'linear', function() {
runCar(carNumber)
});
}
for (var i = 0; i < 10; i++) {
// Значение переменной i копируется в переменную value, которая при каждом из 10 вызовов отдельная
(function(value) {
setTimeout(function () {
console.log(value);
}, 0);
})(i);
}
apply
функции вызывает эту функцию с указанными аргументами. Первый аргумент метода apply
— значение переменой this
внутри функции во время её выполнения, а второй — список аргументов в виде массива.concat
массива объединяет его с другими массивами. Если конкретней, то к массиву, на котором он вызван, добавляет содержимое массивов из всех аргументов и возвращает итоговый массив. При этом массив, на котором вызван этот метод, остаётся неизменным.arr.splice.apply(arr, [index, tmpArr.length].concat(tmpArr));
сначала составляется список аргументов с помощью метода concat (массив аргументов, переданных по-обычному, объединяется с аргументами, переданными через оператор ...), затем с помощью apply
вызывается метод splice
массива и ему передаётся составленный массив аргументов. var inputs = document.querySelectorAll( "input" );
for ( var i = 0; i < inputs.length; ++i ) {
inputs[ i ].addEventListener( 'change', function() {
alert("The text has been changed.");
});
}
document.querySelector( "input" ).addEventListener( 'change', function() {
alert("The text has been changed.");
});
function replaceTag( element, newTag )
{
var elementNew = document.createElement( newTag );
elementNew.innerHTML = element.innerHTML;
Array.prototype.forEach.call( element.attributes, function( attr ) {
elementNew.setAttribute( attr.name, attr.value );
});
element.parentNode.insertBefore( elementNew, element );
element.parentNode.removeChild( element );
return elementNew;
}
var elem = document.createElement( 'script' );
elem.type = 'text/javascript';
elem.async = true;
document.body.appendChild( elem );
elem.src = 'Ваш скрипт.js';
var elem = document.createElement( 'link' );
elem.rel = 'stylesheet';
elem.type = 'text/css';
document.body.appendChild( elem );
elem.href = 'Ваш стиль.css';
function onResize() {
$('.getstarted').height($('.getstarted').width() / (16/8));
}
$(onResize);
$(window).resize(onResize);