首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稀疏数组javascript

稀疏数组javascript
EN

Stack Overflow用户
提问于 2022-10-01 14:18:25
回答 1查看 65关注 0票数 -2

我在Javascript中有一个稀疏数组

代码语言: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 JOINCOALESCE

在Javascript中,如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-01 14:39:13

你说过你想避免一个循环。我假设您是指您编写的循环,因为无论是在代码中还是在调用的函数中,都会涉及到一个循环。

我认为,标准API中最接近的工具是Array.from及其映射回调(可能从id将当前数组映射到idid上的次线性访问时间开始):

代码语言:javascript
复制
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};
});

活生生的例子:

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper {
    max-height: 100% !important;
}

不过,这仍然是一个循环(两个--我们还有一个构建Map的循环)。:-)

这两行:

代码语言:javascript
复制
const element = sparseMap.get(id);
return element ?? {id, value: undefined};

如果你喜欢的话,可以写成一个:

代码语言:javascript
复制
return sparseMap.get(id) ?? {id, value: undefined};

我更喜欢将它们分开,以便在调试时很容易查看元素的来源。

我可能不会那样做,我可能只会写一个简单的循环:

代码语言:javascript
复制
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};
}

活生生的例子:

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper {
    max-height: 100% !important;
}

再一次,这两行:

代码语言:javascript
复制
const element = sparseMap.get(id);
denseArray[id] = element ?? {id, value: undefined};

如果您愿意,可以组合在一起:

代码语言:javascript
复制
denseArray[id] = sparseMap.get(id) ?? {id, value: undefined};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73919043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档