function resetUpdate() {
        update = {};
        if(templateItemName) {
            update[itemStr] = {};
            update[itemStr][TEMPLATEITEMNAME] = templateItemName;
        }
    }
arrayEditor: helper for editing array items that may have come from
    template defaults (in which case they will not exist in the input yet)

@param {object} parentIn: the input container (eg gd.layout)
@param {string} containerStr: the attribute string for the container inside
    `parentIn`.
@param {object} itemOut: the _full* item (eg gd._fullLayout.annotations[0])
    that we'll be editing. Assumed to have been created by `arrayTemplater`.

@returns {object}: {modifyBase, modifyItem, getUpdateObj, applyUpdate}, all functions:
    modifyBase(attr, value): Add an update that's *not* related to the item.
        `attr` is the full attribute string.
    modifyItem(attr, value): Add an update to the item. `attr` is just the
        portion of the attribute string inside the item.
    getUpdateObj(): Get the final constructed update object, to use in
        `restyle` or `relayout`. Also resets the update object in case this
        update was canceled.
    applyUpdate(attr, value): optionally add an update `attr: value`,
        then apply it to `parent` which should be the parent of `containerIn`,
        ie the object to which `containerStr` is the attribute string.