【问题标题】:Convert String Into Delimited Object Key将字符串转换为分隔对象键
【发布时间】:2018-11-30 18:23:51
【问题描述】:

我正在尝试将字符串转换为分隔对象键,但我需要一些帮助来了解如何迭代数组的长度并相应地加入。

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
        }
}

【问题讨论】:

标签: javascript arrays loops join delimiter


【解决方案1】:

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;

【讨论】:

  • 谢谢!不确定我是否完全理解这里发生的事情,但它有效。我将不得不研究减少。
  • 实际上,如果属性包含超过 1 个分隔符,则进一步测试此方法不起作用。
  • @master00 在问题中添加该特殊情况的示例。
【解决方案2】:

为了设置一个值,您可以通过行走给定的对象来分割路径并减少路径。如果不存在对象,则使用名称创建一个新属性。稍后赋值。

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);

【讨论】:

【解决方案3】:

你也可以用一个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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2019-01-23
    • 1970-01-01
    • 2013-05-06
    • 2019-02-11
    • 2021-06-26
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多