代码:
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模块中,我可以执行我所告诉的事情。但是在我的代码中,我无法做到这一点。请帮助我,我该怎么办?
答案 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);