UNPKG

846 BJavaScriptView Raw
1'use strict'
2
3var clone = require('./clone')
4
5/**
6 * Sets a `keypath` into an `object` immutably.
7 *
8 * data = { users: { bob: { name: 'john' } } }
9 * result = set(data, ['users', 'bob', 'name'], 'robert')
10 */
11
12module.exports = function set (object, keypath, value) {
13 var results = {}
14 var parents = {}
15 var i, len
16
17 for (i = 0, len = keypath.length; i < len; i++) {
18 if (i === 0) {
19 parents[i] = object
20 } else {
21 parents[i] = parents[i - 1][keypath[i - 1]] || {}
22 // handle cases when it isn't an object
23 if (typeof parents[i] !== 'object') {
24 parents[i] = {}
25 }
26 }
27 }
28
29 for (i = keypath.length; i >= 0; i--) {
30 if (!parents[i]) {
31 results[i] = value
32 } else {
33 results[i] = clone(parents[i])
34 results[i][keypath[i]] = results[i + 1]
35 }
36 }
37
38 return results[0]
39}