簡體   English   中英

需要根據連續的對象屬性或對象數組中的屬性獲取元素我有一個要搜索的值

[英]Need Get to element based on consecutive object property or properties from array of object i have a value to search

const levels = [
    {
      indexId: 'A',
      level: 1,
      name: 'A',
      parent: '0',
    },
    {
      indexId: 'A-A1',
      level: 2,
      name: 'A1',
      parent: 'A',
    },
    {
      indexId: 'A-A1-A11',
      level: 3,
      name: 'A11',
      parent: 'A-A1',
    },
    {
      indexId: 'A-A1-A11-A111',
      level: 4,
      name: 'A111',
      parent: 'A-A1-A11',
    },
    {
      indexId: 'A-A1-A11-A112',
      level: 4,
      name: 'A112',
      parent: 'A-A1-A11',
    },
    {
      indexId: 'A-A1-A12',
      level: 3,
      name: 'A12',
      parent: 'A-A1',
    },
    {
      indexId: 'A-A1-A12-A121',
      level: 4,
      name: 'A121',
      parent: 'A-A1-A12',
    },
    {
      indexId: 'A-A1-A12-A121-A1211',
      level: 5,
      name: 'A1211',
      parent: 'A-A1-A12-A121',
    },
    {
      indexId: 'A-A2',
      level: 2,
      name: 'A2',
      parent: 'A',
    },
    {
      indexId: 'A-A2-A21',
      level: 3,
      name: 'A21',
      parent: 'A-A2',
    },

    {
      indexId: 'A-A2-A22',
      level: 3,
      name: 'A22',
      parent: 'A-A2',
    },
    {
      indexId: 'A-A3',
      level: 2,
      name: 'A3',
      parent: 'A',
    },
    {
      indexId: 'A-A3-A31',
      level: 3,
      name: 'A31',
      parent: 'A-A3',
    },
    {
      indexId: 'A-A3-A32',
      level: 3,
      name: 'A32',
      parent: 'A-A3',
    },
  ]

 
  const maxLevel = levels.filter(
    l => l.level === Math.max(...levels.map(l => l.level))
  )

  const arrayStrings = []

  function stackLetter(l) {
    for (let index = 1; index <= l.length; index++) {
      arrayStrings.push(l.slice(0, index))
    }
  }

stackLetter(maxLevel[0].indexId.split('-'))
  console.log(arrayStrings)

const buildTree = arrayStrings
    .map(arr => arr.join('-'))
    .map(s => {
      return levels.filter(l => l.indexId === s)
    })

  console.log(buildTree)

最初我得到了最高級別的最長分支

output array = [["A"],["A-A1"],["A-A1-A12"],["A-A1-A12-A121"],["A-A1-A12-A121-A1211"]]

如果我選擇 indexId = 'A-A1-A12' > 我得到 [["A"], ["A-A1"],["A-A1-A12"] ]

但預期的輸出是代碼是與我選擇的節點相關的任何分支,它可能是 =

[["A"],["A-A1"],["A-A1-A12"],["A-A1-A12-A121"],["A-A1-A12-A121-A1211"] ]

或者如果我選擇“A-A3”,它應該給出

[["A"],["A-A3"],["A-A3-A31"]]

或者

[["A"],["A-A3"],["A-A3-A32"]]

以下代碼輸出 OP 中所需的內容。 reduce了原始數組,“記住”了迄今為止“最深”的idlevel 如果處理的itemlevel不連續或indexId不適合selection或“記住” id ,則不會將其添加到輸出數組中。

返回的分支是“深度優先”的,即它找到的第一個,不一定是最深的。

 const levels = [ { indexId: 'A', level: 1, name: 'A', parent: '0', }, { indexId: 'A-A1', level: 2, name: 'A1', parent: 'A', }, { indexId: 'A-A1-A11', level: 3, name: 'A11', parent: 'A-A1', }, { indexId: 'A-A1-A11-A111', level: 4, name: 'A111', parent: 'A-A1-A11', }, { indexId: 'A-A1-A11-A112', level: 4, name: 'A112', parent: 'A-A1-A11', }, { indexId: 'A-A1-A12', level: 3, name: 'A12', parent: 'A-A1', }, { indexId: 'A-A1-A12-A121', level: 4, name: 'A121', parent: 'A-A1-A12', }, { indexId: 'A-A1-A12-A121-A1211', level: 5, name: 'A1211', parent: 'A-A1-A12-A121', }, { indexId: 'A-A2', level: 2, name: 'A2', parent: 'A', }, { indexId: 'A-A2-A21', level: 3, name: 'A21', parent: 'A-A2', }, { indexId: 'A-A2-A22', level: 3, name: 'A22', parent: 'A-A2', }, { indexId: 'A-A3', level: 2, name: 'A3', parent: 'A', }, { indexId: 'A-A3-A31', level: 3, name: 'A31', parent: 'A-A3', }, { indexId: 'A-A3-A32', level: 3, name: 'A32', parent: 'A-A3', }, ] // auxiliary function to compare if 1st string starts with the second one or vice versa (according to legth) function stringMatch(s1,s2) { return s1.length > s2.length ? s1.startsWith(s2) : s2.startsWith(s1); } // main function function extract(input,selection="") { var id = "", level = 0; // initial conditions, storing "last" added item data return input.reduce((answer,item) => { // loop the input array and reduce it ... // do nothing (return unchenged answer) if ... if (item.level !== level + 1) return answer; // ... level is not plus one from current level if (!item.indexId.startsWith(id)) return answer; // ... indexId does not start with current id if (!stringMatch(item.indexId,selection)) return answer; // ... item.indexId does not fit selection // update "last" data level = item.level; id = item.indexId; // return updated answer return [...answer,id]; },[]); // reduction starts from empty array } // test console.log(extract(levels)); // [ 'A', 'A-A1', 'A-A1-A11', 'A-A1-A11-A111' ] console.log(extract(levels,"A-A2")); // [ 'A', 'A-A2', 'A-A2-A21' ] console.log(extract(levels,"A-A3")); // [ 'A', 'A-A3', 'A-A3-A31' ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM