Javascript 基于提供的键遍历对象层次结构?

Javascript 基于提供的键遍历对象层次结构?,javascript,node.js,object,data-structures,data-modeling,Javascript,Node.js,Object,Data Structures,Data Modeling,我有一个接受以下参数的函数: set(section, field, pair, component, element, value) 部分、字段、对和组件只是对象中的键。它们是路径点,因此我们可以沿着层次结构向下移动。显然,部分是我们的切入点 元素是目标键,值是将要设置的值 由于存在不同深度的元素,我想做以下工作: set('utility', null, null, null, 'exportId', 'banana') dataObj[section][field][pair][com

我有一个接受以下参数的函数:

set(section, field, pair, component, element, value)
部分字段组件只是对象中的键。它们是路径点,因此我们可以沿着层次结构向下移动。显然,部分是我们的切入点

元素是目标键,是将要设置的值

由于存在不同深度的元素,我想做以下工作:

set('utility', null, null, null, 'exportId', 'banana')
dataObj[section][field][pair][component][element] = value;
这是一个浅层通道,在内部它会这样做:

dataObj[section][element] = value;

**/ As in
 * data: {
      utility: {
         exportId: 'banana'
      }
 *  }
 */


在其他情况下,当元素在对象内部较深时,可能需要执行以下操作:

set('utility', null, null, null, 'exportId', 'banana')
dataObj[section][field][pair][component][element] = value;
动态定义元素的路径,从而跳过作为“null”传入的键,最好的方法是什么

例如:

set('history', 'current', null, null, 'fruit', 'apple')

**/ As in
 * data: {
      history: {
         current: {
           fruit: 'apple'
        }
      }
 *  }
 */
将内部构造为:

dataObj[section][field][element] = value;

正如您可能已经注意到的,我们跳过了
[pair][component]
,因为这些插槽是作为
null
(s)传入的。

只需将一个对象传递给函数,而不必有一长串特定参数。这样,您只传递您需要传递的内容,并且在调用时不会有任何“null”引用需要处理

使用此实现,此调用可以缩短为以下内容:

您当前的实施:

 set('utility', 'current', null, null, 'exportId', 'banana')
使用对象作为参数:

set({
   section:'utility', 
   field:'current', 
   element: 'exportId', 
   value:'banana'
});
可以使用获取传递给数组的参数。然后使用

函数集(…路径){
返回路径.reduceRight((r,key,i)=>key!==null?{[key]:r}:r)
}
log(set('history','current',null,null,'fruit','apple'))

log(set('utility',null,null,null,'exportId','banana'))
让我测试一下。我想我以前是这样设置的。这不完全是我问题的答案,因为它需要更改实现,但它可能是一个解决方案。我很乐意接受它并继续前进,因为这可能会使我的整个问题变得毫无意义。我使用该对象作为遍历我原始数据结构的手段?@mbilyanov抱歉,我没有理解你,因为这些关键字有点像地图,从某种意义上说,为了达到需要更改的关键点,需要遵循的路径点,我不确定如何使用
reduce
的结果遍历原始数据集。所以我想,我将使用它在原始数据结构中每个键的
reduce
结果中每个键的层次结构中下移。@mbilyanov我已经更新了代码。不确定这是否是你所需要的。你的解决方案是这个问题的一个很好的答案。谢谢但是有一个问题,除了最后两个
exportId
orange
之外,所有参数都是嵌套的。我正在尝试修复您的代码,以便我们实际沿着层次结构走下去,因此
history',current',null,null,'fruit',apple'
将是
history:{current:{fruit:apple}}
使用数组和未定义的参数会更好。阵列上的简单循环