我尝试通过键将值设置为嵌套数组。
我的对象看起来像
var Obj = {
key1: {
key2: value,
}
}
我尝试通过key1.key2
来设置key1
const name = `key1.key2`
Obj[name] = value
我知道我需要像Obj['key1']['key2']
那样做,但是我只得到一个像string
的{{1}}
答案 0 :(得分:3)
如果您不介意使用库,则Ramda和lodash提供帮助程序功能,可以使这种操作非常简单
使用Ramda(此特定操作比lodash稍微冗长,但是我更喜欢Ramda而不是lodash):
name id
John McNamara 3498
Jane Adams 6725
Nour Abd Almohsen Jr. 0197
Alex Ambrose PhD 3287
Nancy Ann Brown 9127
Kathy W. 4389
Jack Joshua Smith White 6756
Jackie Goldman 3294
Mort Evans 5586
const Obj = {
key1: {
key2: 1,
}
}
const name = `key1.key2`
console.log(
R.assocPath(name.split('.'), 2, Obj)
)
// --> { key1: { key2: 2 } }
使用lodash:
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
const Obj = {
key1: {
key2: 1,
}
}
const name = `key1.key2`
console.log(
_.set(Obj, name, 2)
)
// --> { key1: { key2: 2 } }
答案 1 :(得分:0)
尝试一下:
function setValue(obj, keyString, value){
var keys = keyString.split(".");
var tempObj = Obj;
for(var i = 0; i < keys.length; i++){
if(i == keys.length - 1){
tempObj[keys[i]] = value;
return true;
}
if(!(keys[i] in tempObj)) return false;
tempObj = tempObj[keys[i]];
}
}
var Obj = {
key1: {
key2: "value",
}
}
if(setValue(Obj, "key1.key2", "new value")){
console.log(Obj);
}
setValue函数会识别何时提供了无效的keyString,如果是这种情况,则返回false,这样就不会遇到任何麻烦。如果iverything顺利进行,则返回true。
答案 2 :(得分:0)
更新:我想我现在知道您有一个值为Obj
的字符串,并且您想用它来索引let keys = key.split('.')
let answer = keys.reduce((a, k) => a[k], Obj)
。
如果您要这样做,请先将字符串分成键列表,然后依次评估每个键。
let keys = key.split('.')
let target = keys.slice(0, keys.length - 1).reduce((a, k) => a[k], Obj)
target[keys[keys.length -1]] = value
更新2:如果要设置,则要查找的是在字符串中倒数第二个键标识的对象,然后使用最后一个键在该对象上设置值。
Obj
先前的回答:我不确定100%是否确定您要在这里做什么,所以让我们逐步进行一下。
首先,简单的部分。如果您有某个对象let Obj = {}
Obj['key1.key2'] = value
,则用一个键对其进行索引将获取或设置该键的值。所以这个:
{
key1.key2: value
}
产生一个看起来像这样的对象:
key1
这不是您想要的。您想要一个具有一个键key2
的对象,并且希望该键的值是另一个具有键key2
的对象,并且您希望value
的值是{ {1}}。
let Obj = {} // an object...
Obj['key1'] = {} // that has key1, which is an object...
Obj['key1']['key2'] = value // that has key2, which is value
要检索该值,只需使用与第二行相同的语法。
Obj['key1']['key2']
关键点(不好意思,抱歉)是涉及两个对象。一个是Obj
,另一个是Obj['key1']
。
答案 3 :(得分:0)
您可以这样做:
function getVal(obj, key, val) {
const keys = key.split('.');
let pre = obj;
for(let i = 0; i < keys.length - 1; i++) {
pre = pre[keys[i]];
}
pre[keys.length] = val;
return pre;
}
console.log(getVal({key1: {key2: 1}}, 'key1.key2', 2));