Преобразовать строку в ключ объекта с разделителями - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь преобразовать строку в ключ объекта с разделителями, но мне нужна помощь в том, как выполнить итерацию по длине массива и присоединиться соответственно.

SET('my.delimited.string.of.unknown.length')

const SET = key => (state, val) => { 
        if(key.indexOf('.') !== -1) {
            let array = key.split(".")
            for (var i = 0; i < array.length; i++) {
                  // what should I do here?
            }
            // desired output based on array length
            // state[ array[0] ][ array[1] ] = val
            // state.my.delimited.string.of.unknown.length = val
        }
}

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Для установки значения вы можете разделить путь и уменьшить путь, пройдя заданный объект.Если объект не существует, создайте новое свойство с именем.Позже присвойте значение.

function setValue(object, path, value) {
    var keys = path.split('.'),
        last = keys.pop();

    keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
}

var test = {};
setValue(test, "first.deep.property", 1);
setValue(test, "and.another.deep.property", 20);
console.log(test);
0 голосов
/ 01 декабря 2018

Вы также можете сделать это с одним Array.reduce:

const makeObject = (arr, val, obj={}) => {
  arr.split('.').reduce((r,c,i,a) => r[c] = i == a.length-1 ? val : {}, obj)
  return obj
}

console.log(makeObject("first.deep.property", 1))
console.log(makeObject("and.another.deep.property", 20))
0 голосов
/ 30 ноября 2018

Один из тех очень редких случаев использования для reduce:

  const keys = key.split(".");
  const prop = keys.pop();
  keys.reduce((acc, key) => acc[key], state)[prop] = val;

Конечно, это также можно сделать с помощью цикла for:

 let array = key.split("."), acc = state;
 for (var i = 0; i < array.length - 1; i++) {
   acc = acc[ array[i] ];
 }
 acc[ array.pop() ] = val;
...