searchTree.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. var helperCreateTreeFunc = require('./helperCreateTreeFunc')
  2. var arrayEach = require('./arrayEach')
  3. var assign = require('./assign')
  4. function searchTreeItem (matchParent, parent, obj, iterate, context, path, node, parseChildren, opts) {
  5. var paths, nodes, rest, isMatch, hasChild
  6. var rests = []
  7. var hasOriginal = opts.original
  8. var sourceData = opts.data
  9. var mapChildren = opts.mapChildren || parseChildren
  10. var isEvery = opts.isEvery
  11. arrayEach(obj, function (item, index) {
  12. paths = path.concat(['' + index])
  13. nodes = node.concat([item])
  14. isMatch = (matchParent && !isEvery) || iterate.call(context, item, index, obj, paths, parent, nodes)
  15. hasChild = parseChildren && item[parseChildren]
  16. if (isMatch || hasChild) {
  17. if (hasOriginal) {
  18. rest = item
  19. } else {
  20. rest = assign({}, item)
  21. if (sourceData) {
  22. rest[sourceData] = item
  23. }
  24. }
  25. rest[mapChildren] = searchTreeItem(isMatch, item, item[parseChildren], iterate, context, paths, nodes, parseChildren, opts)
  26. if (isMatch || rest[mapChildren].length) {
  27. rests.push(rest)
  28. }
  29. } else if (isMatch) {
  30. rests.push(rest)
  31. }
  32. })
  33. return rests
  34. }
  35. /**
  36. * 从树结构中根据回调查找数据
  37. *
  38. * @param {Object} obj 对象/数组
  39. * @param {Function} iterate(item, index, items, path, parent, nodes) 回调
  40. * @param {Object} options {children: 'children'}
  41. * @param {Object} context 上下文
  42. * @return {Array}
  43. */
  44. var searchTree = helperCreateTreeFunc(function (parent, obj, iterate, context, path, nodes, parseChildren, opts) {
  45. return searchTreeItem(0, parent, obj, iterate, context, path, nodes, parseChildren, opts)
  46. })
  47. module.exports = searchTree