Вы можете использовать некоторый рекурсивный подход для реализации этого.
let str = '1.2.1';
function checkItem(arr, strArr) {
// iterate over the array
arr.forEach((obj) => {
// set selected property based on matching every digit in label in same order
// if digits would be single then you can use startsWith and no need to split string
obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
// if nested item is there then call recursively
obj.items && checkItem(obj.items, strArr);
});
return arr;
}
checkItem(menus, str.split('.'));
var menus = [{
label: "1",
items: [{
label: "1.1"
},
{
label: "1.2",
items: [{
label: "1.2.1"
},
{
label: "1.2.2"
}
]
},
{
label: "1.3"
},
]
},
{
label: "2"
}
];
let str = '1.2.1';
function checkItem(arr, strArr) {
arr.forEach((obj) => {
obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
obj.items && checkItem(obj.items, strArr);
});
return arr;
}
checkItem(menus, str.split('.'));
console.log(menus);
UPADATE: Поскольку вы хотите обновить выбранное свойство полностью независимо от метки можно сделать что-то вроде следующего. Я предполагаю, что вы хотите обновить в зависимости от позиции в массиве.
let str = '1.2.1';
function checkItem(arr, prefixArray, strArr) {
// iterate over the array
arr.forEach((obj, i) => {
// generate new prefix array for checking
let pa = [...prefixArray, i + 1];
// compare prefix array with the string array to check matches
obj.selected = pa.every((it, i) => it == strArr[i]);
// if items defined do it recursively
obj.items && checkItem(obj.items, pa, strArr);
});
return arr;
}
checkItem(menus,[], str.split('.'));
var menus = [{
label: "1",
items: [{
label: "1.1"
},
{
label: "1.2",
items: [{
label: "1.2.1"
},
{
label: "1.2.2"
}
]
},
{
label: "1.3"
},
]
},
{
label: "2"
}
];
let str = '1.2.1';
function checkItem(arr, prefixArray, strArr) {
arr.forEach((obj, i) => {
let pa = [...prefixArray, i + 1];
obj.selected = pa.every((it, i) => it == strArr[i]);
obj.items && checkItem(obj.items, pa, strArr);
});
return arr;
}
checkItem(menus,[], str.split('.'));
console.log(menus);
Вы ищете :hidden
селектор
Обратите внимание на то, что надлежащий способ выбрать элемент идентификатором просто:
$("#test1");
При выполнении его способ, которым Вы делаете, заставляет jQuery сделать ненужный парсинг и намного медленнее.
Если Вы хотите выбрать #test1
только если это скрыто, Вы делаете это:
$("#test1:hidden");
Если Вы хотели выбрать все <span>
элементы, которые скрыты под #p1
, Вы делаете это:
$("span:hidden", "#p1");
Как отмечено в комментариях, противоположность этого селектора :visible
селектор:
$("span:visible", "#p1");
Затем выбрал бы любого видимого <span>
элементы в элементе #p1
.