Javascript 将嵌套数组值映射到Map,并具有按数组索引设置映射值的功能,数组索引将通过引用反映在嵌套数组中
给定创建嵌套数组或任意深度的要求,其中基本数据结构为Javascript 将嵌套数组值映射到Map,并具有按数组索引设置映射值的功能,数组索引将通过引用反映在嵌套数组中,javascript,dictionary,object,multidimensional-array,Javascript,Dictionary,Object,Multidimensional Array,给定创建嵌套数组或任意深度的要求,其中基本数据结构为 [0, [1, [2, [3 /* , [N, [N+1, [..]]] */]]]] 或 其中arr是Array实例,而map是map实例,要求将每个深度映射到map对象,其中 map.get(2) // 2 或 获取在嵌套数组的索引N处设置的值,其中N是嵌套数组的线性索引 此外,要求具备执行的能力 m.set(2, "x") 这将导致 ["a", ["b", ["x", ["d" /* , [N, [N+1, [..]]] */]]
[0, [1, [2, [3 /* , [N, [N+1, [..]]] */]]]]
或
其中arr
是Array
实例,而map
是map
实例,要求将每个深度映射到map
对象,其中
map.get(2) // 2
或
获取在嵌套数组的索引N
处设置的值,其中N
是嵌套数组的线性索引
此外,要求具备执行的能力
m.set(2, "x")
这将导致
["a", ["b", ["x", ["d" /* , [N, [N+1, [..]]] */]]]]
已经能够使用array.prototype.map()
和另外两个array
创建嵌套数组数据结构
我可能错过了一个简单的调整,可以实现预期的功能。当前代码仅执行m.get()
过程
const treeMap=(tree,props=(!Array.isArray(tree))和&typeof tree==“string”
?树。拆分`
:tree),res=[],t=[],m=newmap)=>props.Map((prop,index)=>
!res.length//第一次迭代
?res.push(属性,t)和m.set(索引,属性)//推送第一个值
:索引 //[0、[1、[2、[3]]]
我将在treeMap
函数内部构造一个Map
,称之为mapOfArrs
,它将每个索引映射到其关联的嵌套数组。例如,输入abc
:
mapOfArrs.get(0) // -> ['a', ['b', ['c']]]
mapOfArrs.get(1) // -> ['b', ['c']]
mapOfArrs.get(2) // -> ['c']
然后,您可以返回一个psuedo映射对象,当使用get(prop)
调用该对象时,该对象访问mapOfArrs.get(prop)[0]
以获取相关的嵌套值,而set(prop)
使用mapOfArrs.get(prop)
检索嵌套数组,并将新值分配给其第0个索引mapOfArrs.get(prop)[0]=newVal代码>
由于内部映射,访问/修改任何嵌套值将具有O(1)
复杂性:
const treeMap=(tree)=>{
const[initialItem,…restItems]=Array.isArray(树)
?树
:tree.split(“”);
常量根=[initialItem];
const mapOfArrs=新映射()
.set(0,根);
//构造嵌套结构,将新创建的数组也放入mapOfArrs中:
restItems.reduce((a,item,i)=>{
const newArr=[项目];
a、 推(newArr);
//我们切掉了初始值的第一项,因此必须将i增加1:
映射arrs.set(i+1,newArr);
返回newArr;
},根);
常数psuedoMap={
获得(道具){
返回mapOfArrs.get(prop)[0];
},
套装(道具,纽瓦尔){
mapOfArrs.get(prop)[0]=newVal;
归还这个;
}
};
返回[root,psuedoMap];
};
let[arr,map]=treeMap(“abc”);
控制台日志(arr);
log(map.get(0)、map.get(1)、map.get(2));
地图集(2,“x”)
.set(0,'zzz');
控制台日志(arr);
log(map.get(0)、map.get(1)、map.get(2))
.set
本质上是指设置当前地图实例的属性。在映射上调用.set
应该只设置该映射的属性,并且不应该(也不能)改变外部对象,至少在正常代码中是这样,除非覆盖Map.prototype.set
,这真的很奇怪。map
变量是否需要成为实际的map
,或者您是否可以返回一个对象来模拟map
,同时达到其他要求?@CertainPerformance对map
的模拟不受限制。最初可能会避免使用代理
来限制实现要求所需的对象数量,但问题中并未明确限制使用代理
。主要要求是通过将嵌套数组数据结构视为一个线性索引数组,从而能够按线性顺序设置第n个嵌套数组索引0
-n
@CertainPerformance最初编写代码是为了满足代码审查问题的要求,该问题最终以某种方式发布在SO上修改。决定扩展该功能,以避免必须遍历嵌套数据结构才能获取、设置值。
["a", ["b", ["x", ["d" /* , [N, [N+1, [..]]] */]]]]
mapOfArrs.get(0) // -> ['a', ['b', ['c']]]
mapOfArrs.get(1) // -> ['b', ['c']]
mapOfArrs.get(2) // -> ['c']