树Massiv获取元素的所有链接

时间:2018-11-28 12:05:00

标签: javascript arrays

我有一个对象常量,它基本上是一棵没有固定数量级别的树。 如何以特殊的javascript方式找到特定节点的树,然后使用连接参数返回该节点?

var data = [{
  title: 'topNode',
  id: 1,
  children: [{
    title: 'node1',
    id: 2,
    children: [{
        title: 'randomNode_1',
        id: 3,
      },
      {
        title: 'node2',
        id: 4,
        children: [{
          title: 'randomNode_2',
          id: 5,
          children: [{
            title: 'node2',
            id: 1111,
            children: [{
              title: 'randomNode_3',
              id: 1232,
            }]
          }]
        }]
      }
    ]
  }]
}];

tree build what should be done

从api构建的树

serializeGoals: state => type => {
  const _goals = JSON.parse(JSON.stringify(state.goals))

  return {
    title: 'Стратегия',
    expand: true,
    forst: true,
    children: _goals.filter((item) => {

      if (item.type !== null && type.some(typeID => typeID === item.type.id)) {
        item.shadow = true
      } else if (item.type !== null && type.length > 0) {
        item.shadow = false
        item.type.color = '#ECECEC'
      }

      item.children = _goals.filter((children) => {

        if (children.parent_id === item.id) {
          if (children.type !== null && type.some(typeID => typeID === children.type.id)) {
            children.shadow = true
          } else if (children.type !== null && type.length > 0) {
            children.type.color = '#ECECEC'
            children.shadow = false
          }

          return true
        }
        return false
      })
      return item.parent_id === null
    })
  }
}

获取api服务器JSON数组 parent_id-父元素

[{
    "id": 5,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 5",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 7,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 7",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 9,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 9",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 11,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 3,
    "title": "Тестовая цель - 11",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 3, "title": "Процессы", "color": "#13ce66"}
}, {
    "id": 13,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 13",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 15,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 15",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 17,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 17",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 19,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 19",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 20,
    "parent_id": 11,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 20",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 21,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 3,
    "title": "Тестовая цель - 21",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 3, "title": "Процессы", "color": "#13ce66"}
}, {
    "id": 23,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 23",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 25,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 1,
    "title": "Тестовая цель - 25",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 1, "title": "Финансы", "color": "#ffc82c"}
}, {
    "id": 26,
    "parent_id": 15,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 26",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 27,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 1,
    "title": "Тестовая цель - 27",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 1, "title": "Финансы", "color": "#ffc82c"}
}, {
    "id": 28,
    "parent_id": 7,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 28",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 29,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 29",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 31,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 31",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}, {
    "id": 33,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 3,
    "title": "Тестовая цель - 33",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 3, "title": "Процессы", "color": "#13ce66"}
}, {
    "id": 34,
    "parent_id": 31,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 34",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 35,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 1,
    "title": "Тестовая цель - 35",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 1, "title": "Финансы", "color": "#ffc82c"}
}, {
    "id": 36,
    "parent_id": 34,
    "responsible_id": null,
    "type_id": 1,
    "title": "Тестовая цель - 36",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 1, "title": "Финансы", "color": "#ffc82c"}
}, {
    "id": 37,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 4,
    "title": "Тестовая цель - 37",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 4, "title": "Персонал", "color": "#6190e8"}
}, {
    "id": 39,
    "parent_id": null,
    "responsible_id": null,
    "type_id": 3,
    "title": "Тестовая цель - 39",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 3, "title": "Процессы", "color": "#13ce66"}
}, {
    "id": 40,
    "parent_id": 34,
    "responsible_id": null,
    "type_id": 2,
    "title": "Тестовая цель - 40",
    "description": null,
    "period": 2018,
    "weight": null,
    "responsible": null,
    "type": {"id": 2, "title": "Клиенты", "color": "#ff4949"}
}]

2 个答案:

答案 0 :(得分:0)

我将使用递归函数来遍历树,并在找到所需节点时返回节点(我假设标题是搜索条件),或者如果找不到则返回null

例如:

var data = [
{
    title: 'topNode',
    id: 1,
    children: [
    {
        title: 'node1',
        id: 2,
        children: [
        {
            title: 'randomNode_1',
            id: 3,
        },
        {
            title: 'node2',
            id: 4,
            children: [
            {
                title: 'randomNode_2',
                id: 5,
                children: [
                {
                    title: 'node2',
                    id: 1111,
                    children: [
                    {
                        title: 'randomNode_3',
                        id: 1232,
                    }]
                }]
            }]
        }]
    }]
}];
    
function FindSpecificData(node, titleToFind)
{
  let newNode = null;
  for (let i = 0; i < node.length; ++i)
  {
    if (node[i].title == titleToFind)
      newNode = node[i];
    else if ('children' in node[i])
      newNode = FindSpecificData(node[i].children, titleToFind);
    if (newNode != null)
      return (newNode);
  }
  return (null);
}

console.log(FindSpecificData(data, 'randomNode_2'));
console.log(FindSpecificData(data, 'randomNode_1'));
console.log(FindSpecificData(data, 'missing node'));

答案 1 :(得分:-1)

尝试这种简单的方法来找出您的节点

{None: {'transfers': {'1': {'rows': [{'pointOfSaleID': 2,
  'initialAmount': '£0.00',
  'opened': 'xx, 27/11/2018 11:58',
  'dayIncome': '£336.23',
  'cash': [{'dateTime': '27/11/2018 18:23',
    'employeeName': 'xx',
    'sum': '-£45.00',
    'comment': 'cabs to collect in store stock\nEvents'}],
  'cashTotal': '£291.23',
  'cashExpected': '£291.23',
  'closed': 'xx, 27/11/2018 20:54',
  'banked': '£0.00',
  'left': '£0.00',
  'totalCounted': '£0.00',
  'difference': '-£291.23',
  'varianceReason': '',
  'totalTransactions': 48},
 {'pointOfSaleID': 2,
  'initialAmount': '£0.00',
  'opened': 'xx, 28/11/2018 09:16',
  'dayIncome': '£35.94',
  'cashTotal': '£35.94',
  'cashExpected': '£35.94',
  'closed': '----',
  'banked': '----',
  'left': '----',
  'totalCounted': '----',
  'difference': '----',
  'varianceReason': '',
  'totalTransactions': 3}...]