123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- 'use strict';
- function hasProperty(obj, name) {
- if (typeof obj === 'undefined' || obj === null) {
- return false;
- }
-
- return name in Object(obj);
- }
- function parsePath(path) {
- var str = path.replace(/([^\\])\[/g, '$1.[');
- var parts = str.match(/(\\\.|[^.]+?)+/g);
- return parts.map(function mapMatches(value) {
- if (
- value === 'constructor' ||
- value === '__proto__' ||
- value === 'prototype'
- ) {
- return {};
- }
- var regexp = /^\[(\d+)\]$/;
- var mArr = regexp.exec(value);
- var parsed = null;
- if (mArr) {
- parsed = { i: parseFloat(mArr[1]) };
- } else {
- parsed = { p: value.replace(/\\([.[\]])/g, '$1') };
- }
- return parsed;
- });
- }
- function internalGetPathValue(obj, parsed, pathDepth) {
- var temporaryValue = obj;
- var res = null;
- pathDepth = typeof pathDepth === 'undefined' ? parsed.length : pathDepth;
- for (var i = 0; i < pathDepth; i++) {
- var part = parsed[i];
- if (temporaryValue) {
- if (typeof part.p === 'undefined') {
- temporaryValue = temporaryValue[part.i];
- } else {
- temporaryValue = temporaryValue[part.p];
- }
- if (i === pathDepth - 1) {
- res = temporaryValue;
- }
- }
- }
- return res;
- }
- function internalSetPathValue(obj, val, parsed) {
- var tempObj = obj;
- var pathDepth = parsed.length;
- var part = null;
-
- for (var i = 0; i < pathDepth; i++) {
- var propName = null;
- var propVal = null;
- part = parsed[i];
-
- if (i === pathDepth - 1) {
- propName = typeof part.p === 'undefined' ? part.i : part.p;
-
- tempObj[propName] = val;
- } else if (typeof part.p !== 'undefined' && tempObj[part.p]) {
- tempObj = tempObj[part.p];
- } else if (typeof part.i !== 'undefined' && tempObj[part.i]) {
- tempObj = tempObj[part.i];
- } else {
-
- var next = parsed[i + 1];
-
- propName = typeof part.p === 'undefined' ? part.i : part.p;
-
- propVal = typeof next.p === 'undefined' ? [] : {};
- tempObj[propName] = propVal;
- tempObj = tempObj[propName];
- }
- }
- }
- function getPathInfo(obj, path) {
- var parsed = parsePath(path);
- var last = parsed[parsed.length - 1];
- var info = {
- parent:
- parsed.length > 1 ?
- internalGetPathValue(obj, parsed, parsed.length - 1) :
- obj,
- name: last.p || last.i,
- value: internalGetPathValue(obj, parsed),
- };
- info.exists = hasProperty(info.parent, info.name);
- return info;
- }
- function getPathValue(obj, path) {
- var info = getPathInfo(obj, path);
- return info.value;
- }
- function setPathValue(obj, path, val) {
- var parsed = parsePath(path);
- internalSetPathValue(obj, val, parsed);
- return obj;
- }
- module.exports = {
- hasProperty: hasProperty,
- getPathInfo: getPathInfo,
- getPathValue: getPathValue,
- setPathValue: setPathValue,
- };
|