Children.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { getIteractor } from './may-dom/Iteractor';
  2. export const Children = {
  3. only: function (child) {
  4. if (child && !Array.isArray(child)) {
  5. return child;
  6. }
  7. if (child && child.length === 1 && child[0].mtype) {
  8. return child[0];
  9. }
  10. throw new Error("expect only one child");
  11. },
  12. forEach: function (children, callback, context) {
  13. var ret;
  14. if (!children) {
  15. return null;
  16. }
  17. ret = toArray(children);
  18. ret.forEach(callback, context);
  19. return ret;
  20. },
  21. map: function (children, callback, context) {
  22. var ret = [];
  23. if (children == null) {
  24. //null 或undefinded直接返回
  25. return children;
  26. }
  27. toArray(children).forEach(function (item, index) {
  28. var res = callback.call(context, item, index);
  29. if (res == null) {
  30. return;
  31. } else {
  32. ret.push(res);
  33. }
  34. });
  35. return ret;
  36. },
  37. toArray: function (children) {
  38. if (children == null) {
  39. return [];
  40. }
  41. return toArray(children);
  42. }
  43. }
  44. function toArray(children) {
  45. var ret = [];
  46. if (Array.isArray(children)) {
  47. for (var i = 0; i < children.length; i++) {
  48. var c = children[i];
  49. if (c.type) {
  50. ret.push(c);
  51. } else { //有可能是子数组iterator
  52. var iteratorFn = getIteractor(c);
  53. if (iteratorFn) {
  54. var iterators = callIteractor(iteratorFn, c);
  55. for (var _i = 0; _i < iterators.length; _i++) {
  56. ret.push(iterators[_i]);
  57. }
  58. } else {
  59. ret.push(c);
  60. }
  61. }
  62. }
  63. } else {
  64. ret.push(children);
  65. }
  66. return ret;
  67. }