return promiseEach(props, prop => { if (!prop) throw error(INVALID_PATH, {path}); if (isPlainObject(value)) { if (!value.hasOwnProperty(prop)) { value = undefined; return false; // exit the loop } } else if (Array.isArray(value)) { const index = Number(prop); if (Number.isNaN(index)) throw error(INVALID_INDEX_VALUE, {path, index}); if (index < 0 || index >= value.length) throw error(INDEX_OUT_OF_RANGE, {path, index}); prop = index; } else { throw error(OBJECT_OR_ARRAY_REQUIRED, {path, prop}); } const parent = value; value = value[prop]; return promiseSync(handler(value, prop, parent), val => { value = val; }); }).then(() => value);
function _clone(value, prop, parent, path) { return promiseSync(handler(value, prop, parent, path), value => { if (isPlainObject(value)) return _cloneObject(value, path); else if (Array.isArray(value)) return _cloneArray(value, path); else return value; }); }
return promiseEach(props, prop => { return promiseSync(_clone(obj[prop], prop, obj, path + "." + prop), value => { des[prop] = value; }); }).then(() => des);