Javascript设置嵌套对象键

时间:2020-07-01 14:50:42

标签: javascript nested

代码:

crossfilter.groupAll

我将通过示例向您解释问题。

module.exports.set = function (data, key, value) {
    if (key.includes(".")) {
  
      let elements = key.split(".");
      let element = elements.pop();
      let obj = elements.reduce((object, keyy) => {
        if (typeof object[keyy] == "undefined") object[keyy] = {};
  
        return object[keyy];
      }, data);
  
      obj[element] = value;
  
      return data;
    } else {
      data[key] = value;
  
      return data;
    }
}

控制台日志:

var obj = {};

set(obj, "hello.world", "test")

console.log(obj)

但是如果我编写这段代码:

{
    "hello": {
        "world": "test"
    }
}

对象没有变化。控制台日志将为:

var obj = {
    "hello": {
        "world": "test"
    }
};

set(obj, "hello.world.again", "hello again")

console.log(obj)

我想要这样的结果:

var obj = {
    "hello": {
        "world": "test"
    }
};

在lodash模块中,我可以执行我所告诉的事情。但是在我的代码中,我无法做到这一点。请帮助我,我该怎么办?

2 个答案:

答案 0 :(得分:0)

我的猜测是您正在寻找

if (typeof object[keyy] != "obect")

代替

if (typeof object[keyy] == "undefined")

不会检测当前为属性值的字符串。

当然,呼叫set(obj, "hello.world.again", "hello again")将导致{"hello": {"world": {"again": "hello again"}}},而不是{"hello": {"world": {"again": "test"}}}

答案 1 :(得分:-1)

我发现您的逻辑期望使用JSON对象,但接收到字符串值,它需要像这样 {再次:'hello again'} 那样修改一点或设置值。

我试图简短地编写此 set方法,它可能会对某人有所帮助!

function set(obj, key, value) {
  let keys = key.split('.');
  if(keys.length<2){ obj[key] = value; return obj; }

  let lastKey = keys.pop();

  let fun = `obj.${keys.join('.')} = {${lastKey}: '${value}'};`;
  return new Function(fun)();
}

var obj = {
    "hello": {
        "world": "test"
    }
};

set(obj, "hello.world.again", 'hello again'); // Value should be object here
console.log(obj);

set(obj, "hello.world.again.onece_again", 'hello once again');
console.log(obj);