我在Javascript中有一个稀疏数组
const sparseArray = [
{"id":3, "value":"banana"},
{"id":7, "value":"coconut"}
];
const denseArraySize=10;
I would like to get :
const denseArray = [
{"id":0, "value":undefined},
{"id":1, "value":undefined}
{"id":2, "value":undefined},
{"id":3, "value":"banana"},
{"id":4, "value":undefined}
{"id":5, "value":undefined},
{"id":6, "value":undefined}
{"id":7, "value":"coconut"},
{"id":8, "value":undefined},
{"id":9, "value":undefined}
];如何以功能的方式从denseArray中获取sparseArray。
注意,sparceArray是按id排序的。
在C++中,我能够在线性时间内,懒洋洋地使用ranges::set_union()来完成这个任务。
在SQL中,我将使用LEFT JOIN和COALESCE。
在Javascript中,如何做到这一点?
发布于 2022-10-01 14:39:13
你说过你想避免一个循环。我假设您是指您编写的循环,因为无论是在代码中还是在调用的函数中,都会涉及到一个循环。
我认为,标准API中最接近的工具是Array.from及其映射回调(可能从id将当前数组映射到id到id上的次线性访问时间开始):
const sparseMap = new Map(sparseArray.map((element) => [element.id, element]));
const denseArray = Array.from({length: denseArraySize}, (_, id) => {
const element = sparseMap.get(id);
return element ?? {id, value: undefined};
});活生生的例子:
const sparseArray = [
{"id":3, "value":"banana"},
{"id":7, "value":"coconut"}
];
const denseArraySize=10;
const sparseMap = new Map(sparseArray.map((element) => [element.id, element]));
const denseArray = Array.from({length: denseArraySize}, (_, id) => {
const element = sparseMap.get(id);
return element ?? {id, value: undefined};
});
console.log(denseArray);.as-console-wrapper {
max-height: 100% !important;
}
不过,这仍然是一个循环(两个--我们还有一个构建Map的循环)。:-)
这两行:
const element = sparseMap.get(id);
return element ?? {id, value: undefined};如果你喜欢的话,可以写成一个:
return sparseMap.get(id) ?? {id, value: undefined};我更喜欢将它们分开,以便在调试时很容易查看元素的来源。
我可能不会那样做,我可能只会写一个简单的循环:
const sparseMap = new Map(sparseArray.map((element) => [element.id, element]));
const denseArray = new Array(denseArraySize);
for (let id = 0; id < denseArray.length; ++id) {
const element = sparseMap.get(id);
denseArray[id] = element ?? {id, value: undefined};
}活生生的例子:
const sparseArray = [
{"id":3, "value":"banana"},
{"id":7, "value":"coconut"}
];
const denseArraySize=10;
const sparseMap = new Map(sparseArray.map((element) => [element.id, element]));
const denseArray = new Array(denseArraySize);
for (let id = 0; id < denseArray.length; ++id) {
const element = sparseMap.get(id);
denseArray[id] = element ?? {id, value: undefined};
}
console.log(denseArray);.as-console-wrapper {
max-height: 100% !important;
}
再一次,这两行:
const element = sparseMap.get(id);
denseArray[id] = element ?? {id, value: undefined};如果您愿意,可以组合在一起:
denseArray[id] = sparseMap.get(id) ?? {id, value: undefined};https://stackoverflow.com/questions/73919043
复制相似问题