从现有的数组扩展一个数组?

3

目前,我有一个包含要将key的值更改为false的索引的数组([1, 3])。

有没有好的方法来改进这段代码,以便我不必像变量b中所示那样指定默认值?

这是因为对象的默认数组可能非常大(下面的代码是我应用程序中简化的问题)。

//Specify default value
const b = [
  { key: true },
  { key: true },
  { key: true },
  { key: true },
  { key: true }
]

[1, 3].forEach((x) => {
  b[x].key = false;
})

为了更好地理解问题,您需要b中的每个元素都是唯一的吗?另外,如果您没有在b中指定默认值,那么这些值从哪里来?根据您的情况,您可能需要不同的解决方案。 - unional
你能更好地解释一下你试图解决的具体问题吗?我不确定你现有的数据结构使用是否合理。 - Brad
你的当前代码有什么问题?你是在尝试优化b的定义吗?它应该有多少个元素? - user663031
“扩展数组”是什么意思?在问题中,javascript中的数组是在哪里扩展的?javascript中的问题似乎只设置对象的属性和值?“这是因为默认的对象数组可能非常大”。您是创建对象数组还是从外部资源检索数组?原始对象是否已经设置了“键”? - guest271314
4个回答

1
我的理解是:如何创建一个可能很大的对象数组,其中所有默认值都为{key: true},除了另一个数组中指定索引处的对象应该为{key: false}?我假设您在那时知道总共需要多少个对象。
很难说什么是“最好的”,因为您已经简化了问题。我怀疑也许有一个比您展示的b更合适的数据结构,但是如果没有关于您真正代码的进一步信息,我猜测没有意义。
因此,要创建一个对象数组,其中所有对象默认为相同的key值,而不是潜在的“巨大”数组文字,您只需使用循环即可:
const b = new Array(desiredNumberOfObjects)
for (let i = 0; i < b.length; i++)
  b[i] = { key: true }

然后运行您现有的[1, 3].forEach(...),将所需项目设置为false,这样做是相当有效的,因为它只会循环一次主要的b数组和异常数组。


"...然后运行您现有的[1, 3].forEach(...),将所需项设置为false"。如果正确解释问题,则不需要两个循环来设置Boolean值。 - guest271314
“主循环”是什么意思?OP描述了从“默认对象数组”开始。只需要一个循环即可将每个对象的特定属性设置为“布尔”“true”或“false”。 - guest271314
@guest271314 - 抱歉,我修改了我的評論。無論如何,“主循環”指的是我用來創建所有對象的 for 循環。OP似乎在問是否有一種方法可以在不列出所有對象的字面量的情況下創建默認的對象數組,而第二個數組 [1,3] 列出了默認的異常索引。我不想每次創建對象時都查找那個 [1,3] 數組-似乎後面再用第二個循環將這些異常設置為 false 更有效率。 - nnnnnn
这个问题似乎是在询问如何创建默认的对象数组。根据问题的解释,OP获取了一个对象数组,然后尝试将对象的属性设置为“true”或“false”。 “可能很大”是线索,表明“默认对象”数组不是由OP创建的。虽然你可能是正确的,但问题并没有清楚地说明如何创建或检索“默认对象数组”。 - guest271314
@guest271314 - 当然,我可能曲解了,但是我刚刚重新阅读了一遍,我的理解仍然没有改变。我将在我的答案中添加一个说明来澄清我对问题的解释,这样至少阅读我的答案的人会明白我尝试做什么。 - nnnnnn
显示剩余2条评论

0

您可以将要设置的属性名称存储到变量中;使用Array.prototype.entries()for..of循环中迭代数组的索引和值,将对象的属性值设置为在索引数组上调用.indexOf()返回的Boolean值。

const arr = [
  { a: 1 },
  { b: 2 },
  { c: 3 },
  { d: 4 },
  { e: 5 }
];

let [indexes, prop] = [[1, 3], `key`];

for (let [key, value] of arr.entries()) value[prop] = indexes.indexOf(key) > -1;

console.log(arr);


0

试试这个:

//Specify default value
const b = [];

[1, 3].forEach((x) => {
  if (b[x]) {
    b[x].key = false;
  } else {
    b[x] = { key: false };
  }
})

console.log(b);

不过,中间的值将是未定义的。如果这是个问题,我建议您编写一个函数来检查该值,如下所示:

var something = b[x] ? b[x].key : true;

0

你需要知道数组的大小。假设它是6。然后,你可以使用Array.from初始化数组,并带有一个mapFn参数:

const b = Array.from(Array(6), () => ({key: true}));

[1, 3].forEach(x => b[x].key = false);

console.log(b);

你可能会想使用fill

Array(6).fill({key: true})

但是这样做并不能按预期工作,因为相同的对象将被放置在数组的每个位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接