Ver código fonte

Number key treats parent as array.

Herbert Vojčík 7 anos atrás
pai
commit
1339c76e43
3 arquivos alterados com 26 adições e 3 exclusões
  1. 11 0
      README.md
  2. 8 2
      lib/cow-value-model.js
  3. 7 1
      src/cow-value-model.js

+ 11 - 0
README.md

@@ -90,3 +90,14 @@ in case no change actually happens, returns the original object.
     city(object, "New York") === object;
     // => true
 ```
+
+In case you pass second argument to `cowValueModel`,
+it is used as a parsed list of keys instead of default `firstArg.split('.')`.
+
+If you put a number in a list of keys to use,
+an object will be treated as an array (unlike the default string case,
+where it is treated as an object), so copy wil be created
+using `[...obj]`, not using `{...obj}`.
+
+That way you can create eg. `const c = cowValueObject("name of 34th person", ["person", 34, "name"])`
+to access `obj.person[34].name` with `c(obj)` / `c(obj, val)`.

+ 8 - 2
lib/cow-value-model.js

@@ -6,7 +6,13 @@ Object.defineProperty(exports, "__esModule", {
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function copyWith(obj, key, value) {
+    var result = typeof key === 'number' ? [].concat(_toConsumableArray(obj)) : _extends({}, obj);
+    result[key] = value;
+    return result;
+}
 
 var cowValueModel = exports.cowValueModel = function cowValueModel(key) {
     var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : key.split('.');
@@ -20,7 +26,7 @@ var cowValueModel = exports.cowValueModel = function cowValueModel(key) {
         var key = keys[index],
             value = x[key],
             modified = setField(value, index + 1, val);
-        return value === modified ? x : _extends({}, x, _defineProperty({}, key, modified));
+        return value === modified ? x : copyWith(x, key, modified);
     }
 
     var GET_SENTINEL = {};

+ 7 - 1
src/cow-value-model.js

@@ -1,10 +1,16 @@
+function copyWith (obj, key, value) {
+    const result = typeof key === 'number' ? [...obj] : {...obj};
+    result[key] = value;
+    return result;
+}
+
 export const cowValueModel = (key, keys = key.split('.')) => {
     function setField (x = {}, index, val) {
         if (index >= keys.length) return val;
         const key = keys[index],
             value = x[key],
             modified = setField(value, index + 1, val);
-        return value === modified ? x : {...x, [key]: modified};
+        return value === modified ? x : copyWith(x, key, modified);
     }
 
     const GET_SENTINEL = {};