0

更新:这是带有实时示例链接的代码沙箱。我的用例是构建一个虚拟滚动。我能够以某种方式得到它,请提出更好的方法或改进。

我有一个嵌套的类列表数组和一个学生列表。类似的东西。

"Classes":    
   [
    {
      "ClassId": "XX",
      "ClassTitle": "XX",
      "Students": [
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        }
      ]
    },
    {
      "ClassId": "XX",
      "ClassTitle": "XX",
      "Students": [
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        }
      ]
    },
    {
      "ClassId": "XX",
      "ClassTitle": "XX",
      "Students": [
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        }
      ]
    },
    {
      "ClassId": "XX",
      "ClassTitle": "XX",
      "Students": [
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        },
        {
          "StudentId": "XX",
          "StudentName": "XX",
          "Marks": "XX",
          "etc": "XX"
        }
      ]
    }
  ]

我正在尝试获取嵌套列表的拼接功能。展平列表不适用于我的情况,因为我需要完整的原始结构。

我尝试过这样的事情。有人可以帮我弄这个吗?有没有更好的方法让它更简单。

getNestedSplicedData(nestedItems, startIndex, endIndex) {
  console.log("Start and end indexes are:", startIndex, endIndex);
  let visibleItems = [];
  let currentIndex = 0;
  let totalReqItems = endIndex - startIndex + 1;
  for (let i = 0; i < nestedItems.length; i++) {
    let currentItem = nestedItems[i];
    let childItemsLength =
      currentItem[this.childPropertyName] &&
      currentItem[this.childPropertyName].length
        ? currentItem[this.childPropertyName].length
        : 0;
    const nextItemIndex = currentIndex + childItemsLength + 1;

    if (nextItemIndex - 1 < startIndex) {
      // skip previous items
      currentIndex = nextItemIndex;
      // totalReqItems = totalReqItems - (childItemsLength + 1);
    } else if (nextItemIndex < endIndex && startIndex < currentIndex) {
      // currentItem.Name = currentItem.Name + " - " + totalReqItems; // TODO: Remove it
      visibleItems.push(currentItem);
      currentIndex = nextItemIndex;
      totalReqItems = totalReqItems - (childItemsLength + 1);
    } else {
      let currentItemClone = _.cloneDeep(currentItem);
      let st = startIndex - currentIndex -1;
      if (st < 0) {
        st = 0;
      }
      // -1 is for inclussion of root node.
      // another -1 is for the item at start index.
      let ed = st + totalReqItems -1 -1;
      if (ed >= childItemsLength) {
        ed = childItemsLength - 1;
      }
      currentItemClone[this.childPropertyName] = currentItemClone[
        this.childPropertyName
      ].slice(st, ed + 1);
      // currentItemClone.Name = currentItemClone.Name + " - " + totalReqItems; // TODO: Remove it
      visibleItems.push(currentItemClone);
      currentIndex = nextItemIndex;
      totalReqItems = totalReqItems - (ed - st + 1) - 1; // totalReqItems - childLength - parent Item
    }
    if (totalReqItems <= 0) {
      debugger;
      break;
    }
  }

  return visibleItems;
}
}

我试图使该函数通用以适用于任何类型的一级父子结构的嵌套结构。

4

1 回答 1

0

同时,我编写了这个实现。希望这对其他人也有帮助。这是带有实时示例链接的代码沙箱

非常欢迎任何建议或改进或更好的实施方式。

于 2019-09-14T17:07:04.237 回答