我目前有一个Javascript对象数组,如下所示:
myArray = [
{
id: 'top-id1',
title: 'title1',
subElements: [
{
id: 'id2',
title: 'title2',
subElements: [
{
id: 'id3',
title: 'title2',
subElements: [
...
]
}
]
},
{
id: 'id4',
title: 'title4',
},
...
]
},
{
id: 'top-id5',
title: 'title5',
subElements: [
...
]
},
...
];
从技术上讲,此数组可以是无限长和无限深(通过subElements),但实际上,它在顶层仅具有4个max对象,而在max max内则具有4个最深对象,因此性能和运行时不是大问题。
我要查找的内容:给定任何ID,我需要返回包含第一个ID的顶级对象的ID。因此,如果给我'id3',则需要返回'top-id1'。如果给我“ top-id5”,我还需要返回“ top-id5”。重要的是,这是在React应用程序的上下文中。有人可以帮助我找出实现该目标的算法吗?
答案 0 :(得分:1)
这将适合您的情况。
const myArray = [{ id: 'top-id1', title: 'title1', subElements: [{ id: 'id2', title: 'title2', subElements: [{ id: 'id3', title: 'title2', subElements: [ ] }] }, { id: 'id4', title: 'title4', }, ] }, { id: 'top-id5', title: 'title5', subElements: [ ] }, ];
function searchTree(element, matchingId) {
if (element.id == matchingId) {
return element;
} else if (element.subElements != null) {
var i;
var result = null;
for (i = 0; result == null && i < element.subElements.length; i++) {
result = searchTree(element.subElements[i], matchingId);
}
return result;
}
return null;
}
function searchTopNode(element, data) {
for (var i = 0; i < data.length; i++) {
if (searchTree(data[i], element) != null)
return data[i].id;
}
}
console.log(searchTopNode('id3', myArray));
console.log(searchTopNode('top-id5', myArray));
答案 1 :(得分:0)
const myArray = [{ id: 'top-id1', title: 'title1', subElements: [{ id: 'id2', title: 'title2', subElements: [{ id: 'id3', title: 'title2', subElements: [ ] }] }, { id: 'id4', title: 'title4', }, ] }, { id: 'top-id5', title: 'title5', subElements: [ ] }, ];
function deepSearch(obj, result) {
if (typeof obj !== 'object') {
return;
}
if (Array.isArray(obj)) {
for (let i = 0, elem; elem = obj[i]; i++) {
deepSearch(elem, result);
}
return;
}
if (!!obj['id']) {
result.push(obj.id);
}
if (!!obj['subElements'] && Array.isArray(obj.subElements)) {
deepSearch(obj.subElements, result);
}
}
const results = [];
deepSearch(myArray, results);
console.log(results);
答案 2 :(得分:0)
const myArray = [{ id: 'top-id1', title: 'title1', subElements: [{ id: 'id2', title: 'title2', subElements: [{ id: 'id3', title: 'title2', subElements: [ ] }] }, { id: 'id4', title: 'title4', }, ] }, { id: 'top-id5', title: 'title5', subElements: [ ] }, ];
function findRoot(array, id) {
let node = null
array.forEach(x => {
if (x.id == id) {
node = x
} else {
if (x.subElements) {
let found = findRoot(x.subElements, id)
if (found)
node = x
}
}
if (node)
return
})
return node
}
var result = findRoot(myArray, 'id3')
if (result && result.id)
document.querySelector('#result').innerHTML = result.id
<div id="result"></div>
也许是这样吗?