-numbers += 1;
+numbers -= 1;
from
, но отсутствует в to
. От него пляшем по цепочке, добавляя инкрементируемое свойство для сортировки.const allFrom = tickets.map(item => item.from);
const allTo = tickets.map(item => item.to);
let city = allFrom.filter(item => !allTo.includes(item)).pop(); // первый город
const w = Symbol(); // чтобы случайно не затереть существующее свойство
let i = 0;
let ticket;
while (ticket = tickets.find(t => t.from === city)) {
ticket[w] = i++;
city = ticket.to;
}
// ура! сортировка!
tickets.sort((a, b) => a[w] - b[w]);
tickets.forEach(t => delete t[w]);
$array = [
["TITLE" => "Тест 1", "LEVEL" => 1,],
["TITLE" => "Тест 2", "LEVEL" => 2,],
["TITLE" => "Тест 3", "LEVEL" => 2,],
["TITLE" => "Тест 4", "LEVEL" => 3,],
["TITLE" => "Тест 5", "LEVEL" => 2,],
["TITLE" => "Тест 6", "LEVEL" => 3,],
];
const TITLE = 'TITLE';
const LEVEL = 'LEVEL';
const CHILDREN = 'CHILDREN';
$result = [];
$refs = [];
foreach ($array as $item) {
$level = $item[LEVEL];
if ($level === 1) {
$result[] = $item;
$refs = [&$result[count($result) - 1]];
} else {
for ($i = count($refs) - 1; $i >= 0; $i--) {
$parent = &$refs[$i];
if ($parent[LEVEL] === $level - 1) {
if (!isset($parent[CHILDREN])) {
$parent[CHILDREN] = [];
}
$parent[CHILDREN][] = $item;
array_splice($refs, $i + 1);
$refs[] = &$parent[CHILDREN][count($parent[CHILDREN]) - 1];
unset($parent);
break;
} else {
unset($parent);
continue;
}
}
}
}
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
[
{
"TITLE": "Тест 1",
"LEVEL": 1,
"CHILDREN": [
{
"TITLE": "Тест 2",
"LEVEL": 2
},
{
"TITLE": "Тест 3",
"LEVEL": 2,
"CHILDREN": [
{
"TITLE": "Тест 4",
"LEVEL": 3
}
]
},
{
"TITLE": "Тест 5",
"LEVEL": 2,
"CHILDREN": [
{
"TITLE": "Тест 6",
"LEVEL": 3
}
]
}
]
}
]
:invalid
inArray()
возвращает функцию. Эта ф-я проверяет, входит ли переданный ей аргумент в массив, с которым она создавалась. const myInArray = inArray([1,2,3]);
myInArray(4) // false
myInArray(1) // true
filter()
– т.е. из него остаются только те элементы, для которых функция вернёт true
. image.value // будет undefuned
image.getAttribute('value') // "5" — строка текста!
if (value++ === 5) {
break;
}
id
в ваших объектах?нет у item'а свойства "index". Тогда уж, возвращайте переданный index:const indexArr = users.map(( item, index ) => item.index)
(item, index) => index
Впрочем, индексы выводить, скорее всего, не нужно — для чего печатать числа от 0 до N.const fullNames = users.map( fullName ).filter(( item, index, array ) => { return array.indexOf( item ) === index })
.map()
создаётся новый массив, состоящий только из полных имён. Функцию fullName()
вы не привели в вопросе, но скорее всего, она из item'а делает строку item.name + ' ' + item.lastName
['Вася', 'Оля', 'Вася']
0
- в нулевой позиции он нашёлся. Для первого Васи это ок, он останется. Зато для третьего Васи индекс будет 2
, а поиск вернёт всё тот же 0
. Так как 2 !== 0
, дубликат-Вася вылетает и не попадает в результат. length
под этим углом:const { documentElement: el } = document;
const [cx, cy] = [el.clientWidth / 2, el.clientHeight / 2];
const angle = Math.atan2(y - cy, x - cx);
const length = 50;
const [bx, by] = [cx + length * Math.cos(angle), cy + length * Math.sin(angle)];
// рисуем линию из (cx, cy) в (bx, by)
ctx.translate(width/2, height/2)
— и центр (0, 0) теперь будет в центре холста.