choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
97 lines (82 loc) • 2.24 kB
JavaScript
import isObject from 'lodash/isObject';
import { isArrayLike, observable } from 'mobx';
import { mobxGet, mobxRemove, mobxSet } from './MobxUtils';
export function get(obj, prop) {
if (obj === null) {
return null;
}
if (obj !== undefined) {
var index = prop.indexOf('.');
if (index !== -1) {
var key = prop.slice(0, index);
var restKey = prop.slice(index + 1);
var value = mobxGet(obj, key);
if (value === null) {
return null;
}
if (isArrayLike(value)) {
return value.map(function (item) {
return get(item, restKey);
}).filter(function (item) {
return !!item;
});
}
if (isObject(value)) {
return get(value, restKey);
}
} else {
return mobxGet(obj, prop);
}
}
}
export function set(data, prop, value) {
var fields = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : observable.map();
var index = prop.indexOf('.');
if (index !== -1) {
var key = prop.slice(0, index);
if (!data[key] && value !== undefined) {
var field = fields.get(key);
if (field && field.get('multiple')) {
mobxSet(data, key, []);
} else {
mobxSet(data, key, {});
}
}
var obj = mobxGet(data, key);
if (isArrayLike(obj)) {
if (isArrayLike(value)) {
value.forEach(function (item, i) {
if (obj.length === i) {
obj.push({});
} else if (!obj[i]) {
obj[i] = {};
}
set(obj[i], prop.slice(index + 1), item);
});
}
} else if (isObject(obj)) {
set(obj, prop.slice(index + 1), value);
}
} else {
mobxSet(data, prop, value);
}
}
export function remove(obj, prop) {
var index = prop.indexOf('.');
if (index !== -1) {
var value = mobxGet(obj, prop.slice(0, index));
if (value) {
var restKey = prop.slice(index + 1);
if (isArrayLike(value)) {
value.forEach(function (item) {
return remove(item, restKey);
});
} else if (isObject(value)) {
remove(value, restKey);
}
}
} else {
mobxRemove(obj, prop);
}
}
//# sourceMappingURL=ObjectChainValue.js.map