从嵌套数组构建祖先列表

时间:2019-10-16 09:58:26

标签: javascript arrays multidimensional-array

嵌套数组如下:

var arr = [{
  id: 2,
  name: 'a',
  children: []
}, {
  id: 5,
  name: 'b',
  children: [{ 
    id: 14,
    name: 'b2'
  }]

}, {
  id: 15,
  name: 'd',
  children: []
}];

如何从任何给定元素中列出祖先元素?

例如,如果给定元素具有id: 14,则列表应仅返回父级:

[{
  id: 5,
  name: 'b',
  children: [...]
}] 

我正在寻找复制“面包屑”导航

4 个答案:

答案 0 :(得分:2)

您可以移交作为父对象的对象,然后递归搜索所需的id

function getParent(object, id) {
    var result;
    (object.children || []).some(o => result = o.id === id ? object : getParent(o, id));
    return result;
}

var array = [{ id: 2, name: 'a', children: [] }, { id: 5, name: 'b', children: [{  id: 14, name: 'b2' }] }, { id: 15, name: 'd', children: [] }];

console.log(getParent({ children: array }, 14));
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您希望移交数组,则可以采用具有递归功能的嵌套方法。

function getParent(children, id) {

    function iter(object) {
        var result;
        (object.children || []).some(o => result = o.id === id ? object : iter(o));
        return result;
    }

    return iter({ children });
}

var array = [{ id: 2, name: 'a', children: [] }, { id: 5, name: 'b', children: [{  id: 14, name: 'b2' }] }, { id: 15, name: 'd', children: [] }];

console.log(getParent(array, 14));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

如果我们可以假设仅存在两个级别(父母和子女,而不是子女的子女),则以下功能findAncestor()可以满足您的需求。迭代所有父元素,并检查它们是否有一个具有相关ID的子元素。

function findAncestor(id) {
  for (let i = 0; i < arr.length; i++) {
    let obj = arr[i];
    if (obj.hasOwnProperty('children')) {
      if (obj.children.length > 0) {
        for (let j = 0; j < obj.children.length; j++) {
          if (obj.children[j].id === id) {
            return obj;
          }
        }
      }
    }
  }

  return null;
}

console.info(findAncestor(14));

如果需要处理一个ID相同的孩子可能在多个父母中发生的情况,则应使用结果数组并将所有找到的结果添加到该数组中,然后最后将其返回。

答案 2 :(得分:1)

您可以尝试这种方式,

        do {
        printf("Do you want to find a factorial? Y || y to continue");
        scanf("%c", &ch);
        printf("Enter the value of Number:");
        scanf("%d", &num);

//Here you do your factorial number computation and error checks

    } while (ch == 'y' || ch == 'Y');

答案 3 :(得分:1)

深度优先搜索算法-获取父节点是:

function getParentNodeByKey(obj, targetId, paramKey) {
    if (obj.children) {
        if (obj.children.some(ch => ch[paramKey] === targetId))
            return obj;
        else {
            for (let item of obj.children) {
                let check = this.getParentNodeByKey(item, targetId, paramKey)
                if (check) {
                    return check;
                }
            }
        }
    }
    return null
}

和要测试的代码:

var arr = [{
    id: 2,
    name: 'a',
    children: []
  }, {
    id: 5,
    name: 'b',
    children: [{
      id: 14,
      name: 'b2'
    }]

  }, {
    id: 15,
    name: 'd',
    children: []
}];

let parentElement;
const valueToFind = 14;
const desiredkey = 'id';
for (let i = 0; i < arr.length; i++) {
    parentElement = getParentNodeByKey(arr[i], valueToFind, desiredkey);
    if(parentElement)
        break;
}

console.log(`The parent element is:`, parentElement);