【问题标题】:javascript variable key in loop循环中的javascript变量键
【发布时间】:2020-05-20 17:21:01
【问题描述】:

使用 Slickgrid 我正在尝试使用 setCellCssStyles 方法设置单元格的 CSS

for (var rowIndx = 1; rowIndx < movmentRows.length; rowIndx++) {
  grid.setCellCssStyles("disabled", {
    rowIndx: {
      san: "slick-cellreadonly",
      ean: "slick-cellreadonly",
    },
  });
}

我理解它,因为我在 for 循环中使用变量作为键。 但我不明白如何使这项工作。 我试图用 [rowIndx] 替换 rowIndx,但出现语法错误,所以我认为我的 JavaScript 不是 ES6。然后我尝试了以下方法,但这也给出了语法错误 -

遇到'['和预期的关键字或大括号。

for(var rowIndx=1;rowIndx<movmentRows.length;rowIndx++){
  var key = {};
  grid.setCellCssStyles("natCol-greyed", {
    key[rowIndx] : {
      sourceAccountNational: "slick-cellreadonly",
      excludeAccountNational: "slick-cellreadonly"
    }
  });
}

请提出建议。

【问题讨论】:

标签: javascript slickgrid


【解决方案1】:

如果你试图创建一个对象,但想使用一个变量作为键,语法如下:

let keyName = "foo"

let object = { [keyName]: "bar" }
 // gives the object `{"foo": "bar}

在较旧的 javascript 中,您必须在创建对象后分配给键:

let keyName = "foo"

let object = {}
object[keyName] = "bar"

另外,当我可以使用迭代器时,我尽量不要执行“手动”循环。它比“手动”循环更不容易出错,并且允许您使用不同类型的集合而不仅仅是数组,因此它更灵活。有两种主要方法可以做到这一点:

for … of 循环:

let collection = ["a", "b", "c"]

for (let value of collection) {
  console.log("value:", value)
}
// if you also want the index
for (let [index, value] of collection.entries()) {
  console.log("value and index:", value, index)
}
// or _just_ the indexes (note this skip empty values in sparse arrays)
for (let index of collection.keys()) {
  console.log("index:", index)
}

使用forEach

collection.forEach((item, index) => console.log(item, index))

这两种方法的工作原理通常相同,但for … of 循环更接近“手动”循环。但是,forEach 有点老,所以可能有更多的地方可用。另外,看看类似的map

【讨论】:

  • 不,不要看map,除非你使用的是另一个数组的输出。此外,OP 正在使用数组中元素的索引,因此 for..of 甚至没有意义。如果您包含 index 参数,forEach 将起作用。但是一个普通的for 循环就可以了
  • 我提到了map,因为我看到很多人推送到数组而不是使用地图:)。但是,是的,对于这种特定情况,forEach 更好。但是,也请查看map 以供将来参考。
  • 我看到很多人使用map 来获得副作用,而不是使用forEach 或普通的for 循环:)。
  • @HereticMonkey 老实说,这让我的烦恼更少:)。但通常我无论如何都想消除副作用,所以map 是我想要的:)。
【解决方案2】:

如果 moveRows 是一个数组,您可以使用 for...of 循环,如下所示:

for (const [index, row] of movmentRows.entries()) { //index is the index of each itteration and row is the value
  grid.setCellCssStyles("disabled", {
    [row]: {
      san: "slick-cellreadonly",
      ean: "slick-cellreadonly",
    },
  });
}

要将对象键设置为变量,您可以将其放在括号中..

for..of 循环注意事项:IE 不支持。

More on how to dynamically set object properties

More on For...Of loop

【讨论】:

  • 如果 OP 想要该行的索引作为键,这是行不通的;这将使用数组元素作为键。
  • 我也更新了我的答案以支持索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2019-01-07
相关资源
最近更新 更多