Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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_Lodash - Fatal编程技术网

Javascript 深度替换一个值,知道我们必须在其中注入值的对象中的属性的值

Javascript 深度替换一个值,知道我们必须在其中注入值的对象中的属性的值,javascript,lodash,Javascript,Lodash,我们有一个深度嵌套的结构,每次运行应用程序时都会发生变化 { some: { complex: { unknown: { structure: { fields: [ { name: "group1", other: "data", currentValue: "" }, { name: "group2", other: "another data", currentValue: "" }

我们有一个深度嵌套的结构,每次运行应用程序时都会发生变化

{
  some: {
    complex: {
      unknown: {
        structure: {
          fields: [
            { name: "group1", other: "data", currentValue: "" },
            { name: "group2", other: "another data", currentValue: "" },
          ]
        }
      }
    }
  }
}
我们必须在这个结构中注入适当的值。例如,我们收到

{ 
  group1: 'the proper value'
}
我们必须替换适当组中的值,以获得:

{
  some: {
    complex: {
      unknown: {
        structure: {
          fields: [
            { name: "group1", other: "data", currentValue: "the proper value" },
            { name: "group2", other: "another data", currentValue: "" },
          ]
        }
      }
    }
  }
}

我们尝试使用lodash mergeWith,但由于我们不知道必须注入的值的确切位置,并且我们只知道必须注入值的对象的键的值,因此我们没有成功地实现这一点。

解决方案可以是使用如下递归函数:

对象={
一些:{
复杂:{
未知:{
结构:{
字段:[
{name:“group1”,other:“data”,currentValue:“},
{name:“group2”,other:“另一个数据”,currentValue:“},
]
}
}
}
}
};
newValue={
组1:“正确的值”
};
插入的var=false;
函数搜索(数据、新数据){
如果(插入)返回;
用于(输入数据){
if(data[key]==Object.keys(newData)[0]){
data[“currentValue”]=newData[Object.keys(newData)[0]];
插入=真;
返回;
}否则
搜索(数据[键]、新数据);
}
}   
搜索(对象、新值);

console.log(对象)您可以执行递归搜索并替换

让theObj={
一些:{
复杂:{
未知:{
结构:{
字段:[
{name:“group1”,other:“data”,currentValue:“},
{name:“group2”,other:“另一个数据”,currentValue:“},
]
}
}
}
}
}
函数更新bj(对象,替换){
if(数组isArray(obj)){
让key=Object.key(替换)[0]
让itm=obj.find(i=>i.name==key)
itm.data=替换[键]
}else if(对象的类型=='object'){
用于(让我输入obj){
更新bj(obj[i],替换)
}
}
}
updateObj(theObj,{group1:'正确的值'})

log(theObj)
有一个递归函数遍历对象,并根据您所寻找的值对其进行变异

const obj={
一些:{
复杂:{
未知:{
结构:{
字段:[{
名称:'group1',
其他:"数据",,
当前值:“”,
},
{
名称:'group2',
其他:"另一数据",,
当前值:“”,
},
],
},
},
},
},
};
常数更改={
组1:'正确的值',
组2:'正确的值2',
};
//去替换的递归函数
函数lookAndReplace(配置,ptr){
//如果我们处理一个对象,看看它的键
如果(ptr的类型=='object'){
Object.keys(ptr.forEach)((x)=>{
//如果键是我们要找的,请检查后面的值
if(x==config.keyToCheck){
//我们发现了一个我们想要替换的东西
//替换值并离开
if(ptr[x]==config.key){
ptr[config.keyToReplace]=config.value;
}
返回;
}
//查看数据键后面的值
lookAndReplace(配置,ptr[x]);
});
}
//如果我们正在处理数组,请查找键
//在每个元素内部
if(阵列的ptr实例){
forEach(x=>lookAndReplace(config,x));
}
}
//对于我们寻找的每一组,去替换
Object.keys(toChange.forEach)(x=>lookAndReplace({
关键词:x,
值:toChange[x],
keyToCheck:'name',
keyToReplace:'currentValue',
},obj));

控制台日志(obj)
您将把它注入
字段
数组?递归检查对象的可枚举属性以获得匹配名称如何?您可能需要重构以禁用某些其他属性上的可枚举标志是的,我们必须在fields数组中注入。但我们不知道字段的层次结构。检查包含匹配名称的对象,然后如何将其重新注入到适当的位置以获得适当的对象?您可以递归地循环检查每个项是否为对象,直到找到数组,然后更新字段,以明确您拥有对象,并且您知道必须更改键
name
后面组的键
currentValue
中的值:
group1
?为什么
key
itm
let
变量?因为我喜欢
let
,所以如果您使用此代码,知道eslint会给你错误。因为变量没有被重新分配,所以它帮助了我们很多,并且启发了我们一个具体的案例