docs: function mergeChildren(el, dataIndex, elOption, animatableModel, data) {
      var newChildren = elOption.children;
      var newLen = newChildren ? newChildren.length : 0;
      var mergeChildren = elOption.$mergeChildren;
      // `diffChildrenByName` has been deprecated.
      var byName = mergeChildren === 'byName' || elOption.diffChildrenByName;
      var notMerge = mergeChildren === false;
  
      // For better performance on roam update, only enter if necessary.
      if (!newLen && !byName && !notMerge) {
          return;
      }
  
      if (byName) {
          diffGroupChildren({
              oldChildren: el.children() || [],
              newChildren: newChildren || [],
              dataIndex: dataIndex,
              animatableModel: animatableModel,
              group: el,
              data: data
          });
          return;
      }
  
      notMerge && el.removeAll();
  
      // Mapping children of a group simply by index, which
      // might be better performance.
      var index = 0;
      for (; index < newLen; index++) {
          newChildren[index] && doCreateOrUpdate(
              el.childAt(index),
              dataIndex,
              newChildren[index],
              animatableModel,
              el,
              data
          );
      }
      if (__DEV__) {
          zrUtil.assert(
              !notMerge || el.childCount() === index,
              'MUST NOT contain empty item in children array when `group.$mergeChildren` is `false`.'
          );
      }
  }