2016-04-28 58 views
10

我有一個嵌套數組,一旦滿足條件,它應該給所有的父ID,例如我有一個數據數組,其中我應該匹配一旦條件滿足,如何獲取嵌套數組的ID?

  • getParentIds(data,182,[]);
    • 結果:[96,182];
  • getParentIds(data,174,[]);
    • 結果:[109,219,76,174];

var data = [{ 
 
    "id": 96, 
 
    "name": "test1", 
 
    "items": [{ 
 
    "id": 181, 
 
    "name": "Yes", 
 
    "items": [] 
 
    }, { 
 
    "id": 182, 
 
    "name": "No", 
 
    "items": [] 
 
    }] 
 
}, { 
 
    "id": 109, 
 
    "name": "Test5", 
 
    "items": [{ 
 
    "id": 219, 
 
    "name": "opt2", 
 
    "items": [{ 
 
     "id": 76, 
 
     "name": "test3", 
 
     "items": [{ 
 
     "id": 173, 
 
     "name": "Yes", 
 
     "items": [] 
 
     }, { 
 
     "id": 174, 
 
     "name": "No", 
 
     "items": [{ 
 
      "id": 100, 
 
      "name": "test2", 
 
      "items": [{ 
 
      "id": 189, 
 
      "name": "Yes", 
 
      "items": [] 
 
      }] 
 
     }] 
 
     }] 
 
    }] 
 
    }, { 
 
    "id": 224, 
 
    "name": "opt3", 
 
    "items": [] 
 
    }] 
 
}]; 
 

 

 
function getParentIds(data, id, parentIds) { 
 
    if (!parentIds) { 
 
    parentIds = []; 
 
    } 
 
    data.map(function(item) { 
 
    if (item.id === id) { 
 
     parentIds.push(item.id); 
 
     return parentIds; 
 
    } else if (item.items.length === 0) { 
 
     // do nothing 
 
    } else { 
 
     return getParentIds(item.items, id, parentIds); 
 
    } 
 
    }); 
 
} 
 

 
console.log("Array list: " + getParentIds(data, 182, []));

能給我這個什麼建議嗎?

+0

* JS:71未捕獲的ReferenceError:getParentDetails沒有定義* – isvforall

+0

嘗試像後序遍歷 –

+0

[Array.prototype.map()](HTTPS://developer.mozilla。 org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)根據回調函數返回數組的新版本,您可能需要[Array.prototype.forEach()](https:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)和'getParentIds()'應該返回一個值,所以在'foreach()'循環之後,你應該'返回parentIds;' –

回答

2

這是一個很酷的問題。我花了比我預計的要解決這個問題,但這裏有一個breadth-first search實現:

var data = [{ 
 
    "id": 96, 
 
    "name": "test1", 
 
    "items": [{ 
 
    "id": 181, 
 
    "name": "Yes", 
 
    "items": [] 
 
    }, { 
 
    "id": 182, 
 
    "name": "No", 
 
    "items": [] 
 
    }] 
 
}, { 
 
    "id": 109, 
 
    "name": "Test5", 
 
    "items": [{ 
 
    "id": 219, 
 
    "name": "opt2", 
 
    "items": [{ 
 
     "id": 76, 
 
     "name": "test3", 
 
     "items": [{ 
 
     "id": 173, 
 
     "name": "Yes", 
 
     "items": [] 
 
     }, { 
 
     "id": 174, 
 
     "name": "No", 
 
     "items": [{ 
 
      "id": 100, 
 
      "name": "test2", 
 
      "items": [{ 
 
      "id": 189, 
 
      "name": "Yes", 
 
      "items": [] 
 
      }] 
 
     }] 
 
     }] 
 
    }] 
 
    }, { 
 
    "id": 224, 
 
    "name": "opt3", 
 
    "items": [] 
 
    }] 
 
}]; 
 

 

 
function parentsOf(arr, id, parents){ 
 
    if (parents.length) 
 
     return parents; 
 
    // I use for(;;) instead of map() because I need the return to exit the loop 
 
    for (var i = 0; i < arr.length; i++){ 
 
     if (arr[i].id == id){ 
 
      //push the current element at the front of the parents array 
 
      parents.unshift(arr[i].id); 
 
      return parents; 
 
     }; 
 
     if (arr[i].items){ 
 
      parents = parentsOf(arr[i].items, id, parents); 
 
      // if the parents array has any elements in it it means we found the child 
 
      if (parents.length){ 
 
       parents.unshift(arr[i].id); 
 
       return parents; 
 
      } 
 
     } 
 
    } 
 
    return parents; 
 
} 
 

 
console.log("Array list for 182: " + parentsOf(data, 182, [])); 
 
console.log("Array list for 174: " + parentsOf(data, 174, []));

1

如果這個任務將反覆做這將是一個聰明的做法首先嵌套數組壓扁成一個哈希表,其中的鍵將是id屬性。扁平化時,您可以將父項屬性添加到對象。然後,搜索將像訪問散列表上的對象屬性一樣簡單快捷。以下演示了上述方法。

var data = [{ 
 
    "id": 96, 
 
    "name": "test1", 
 
    "items": [{ 
 
    "id": 181, 
 
    "name": "Yes", 
 
    "items": [] 
 
    }, { 
 
    "id": 182, 
 
    "name": "No", 
 
    "items": [] 
 
    }] 
 
}, { 
 
    "id": 109, 
 
    "name": "Test5", 
 
    "items": [{ 
 
    "id": 219, 
 
    "name": "opt2", 
 
    "items": [{ 
 
     "id": 76, 
 
     "name": "test3", 
 
     "items": [{ 
 
     "id": 173, 
 
     "name": "Yes", 
 
     "items": [] 
 
     }, { 
 
     "id": 174, 
 
     "name": "No", 
 
     "items": [{ 
 
      "id": 100, 
 
      "name": "test2", 
 
      "items": [{ 
 
      "id": 189, 
 
      "name": "Yes", 
 
      "items": [] 
 
      }] 
 
     }] 
 
     }] 
 
    }] 
 
    }, { 
 
    "id": 224, 
 
    "name": "opt3", 
 
    "items": [] 
 
    }] 
 
}], 
 

 
getParents = (ar, id) => {var fData = (a, pid, pin) => a.reduce((p,c) => {c.parents = pid.concat(); 
 
                      p[c.id] = c; 
 
                      c.items.length && fData(c.items, pid.concat(c.id), p); 
 
                      return p; 
 
                     }, pin); 
 
          return fData(ar,[],{})[id].parents; 
 
         }; //so much for getParents 
 

 
document.write("<pre>" + JSON.stringify(getParents(data, 189), null, 2) + "</pre>");

+0

Hi Redu,我想嘗試你的方法來獲得我的結果。但是代碼沒有提供正確的結果。它遍歷所有的id。我相信,缺少檢查父ID的條件。你能幫我得到確切的結果嗎? 感謝您的支持! –

+0

@Premkumar Jayaseelan:哇,好吧..我會修復它... – Redu

+0

@Premkumar Jayaseelan:確定修復..甚至有點短。 – Redu