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']