Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法来修改JavaScript对象中的嵌套项?_Javascript_Json - Fatal编程技术网

有没有更好的方法来修改JavaScript对象中的嵌套项?

有没有更好的方法来修改JavaScript对象中的嵌套项?,javascript,json,Javascript,Json,我知道eval很糟糕,但我真的找不到更好的方法来做这件事 我收到一个输入字符串(来自命令提示符),我需要修改存储的JSON对象中表示文件系统的嵌套项的一些值 这里有更详细的内容: 我正在为我的命令提示符制作一个edit命令,其形式如下: 编辑 我的代码接收,并在文件系统中查找它,以检查它是否存在 下面是一个示例文件系统(JSON格式,基于Linux): { “家”:{ “默认值”:{ “文件”:{}, “tst”:“这是一个文件” } } “等”:{} “tmp”:{} } 因此,如果用户的

我知道
eval
很糟糕,但我真的找不到更好的方法来做这件事

我收到一个输入字符串(来自命令提示符),我需要修改存储的JSON对象中表示文件系统的嵌套项的一些值

这里有更详细的内容:

我正在为我的命令提示符制作一个
edit
命令,其形式如下:

编辑
我的代码接收
,并在文件系统中查找它,以检查它是否存在

下面是一个示例文件系统(JSON格式,基于Linux):

{
“家”:{
“默认值”:{
“文件”:{},
“tst”:“这是一个文件”
}
}
“等”:{}
“tmp”:{}
}
因此,如果用户的PWD(当前工作目录)是
/home
,并且他们输入
default/tst
,他们应该编辑
/home/default/tst

我就是这样尝试的:

var wdir=JSON.parse(localStorage.getItem(“filesys”);//完整目录(wdir)-获取存储的文件系统
var cdir=wdir;//当前目录(cdir)
变量i;//循环变量
var l=f.length;//f类似于[“default”,“tst”]
var runstr=“wdir”//要评估的事情

对于(i=0;i有趣的代码,下面的代码段应该可以做到这一点!您可能需要添加一些附加条件,以防止用户重写文件夹! 我使用spread操作符对对象进行“深度复制”,如果要直接更改传递给函数的对象,可以删除第一行,并在reducer中用obj替换deepCopy:)

const setObjectPropertyAtPath=(对象、路径、值)=>{
//我们对对象进行深度复制是因为我们希望更改此副本,而不是直接将对象传递给//函数。这样做为我们提供了一种返回已修改对象的方法,而不是直接更改原始//对象
const deepCopy={…obj}
路径减少((acc、cur、level)=>{
如果(级别===path.length-1){
acc[cur]=值;
返回值;
}
返回acc[cur];
},deepCopy)
返回副本;
}
常数fs={
“家”:{
“默认值”:{
“文件”:{},
“tst”:“这是一个文件”
}
},
“等”:{},
“tmp”:{}
}
const updatedFs=setObjectPropertyAtPath(fs、[“主”、“默认”、“tst”]、“foo”)

console.log(updatedFs)
要更改对象中的值吗?在代码中有对属性的引用时,为什么要建立字符串?
cdir[n]=t.value设置值。。。。你应该没有理由需要eval@epascarello:但是
cdir
每次都会被剪切,所以它不会是整个目录。这就是我用
eval
修改
wdir
的原因。您遍历树并设置值。就是这个价值。因此wdir将具有新的值<代码>console.log(JSON.stringify(wdir))并查看它是什么。谢谢您的回答!它真的帮助了我!只有一个问题-我们可以为删除密钥执行类似的过程吗?对不起,我不太明白
reduce
的意思。是的,当然不用“acc[cur]=value”,你可以简单地执行“delete acc[cur]”,reduce乍一看似乎很难,但你真的应该阅读文档并亲自尝试:)我试过了,成功了。我之前没有回应的原因是我正在想办法让它发挥作用。结果是,当我执行
delete
命令时,
f
不是我想要的,所以我对它进行了一些调整,它成功了!我想我也可以使用我对
reduce
的新知识,对类似的命令(如
create
)执行同样的操作。谢谢大家的支持!