获取ARRAY表达式中当前元素索引的方法?

时间:2017-05-07 02:17:26

标签: couchbase n1ql nosql

ARRAY表达式的工作方式类似于JS中的Array.prototype.map方法,因为它将元素从一个数组转换为新数组。 ARRAY缺少的一件事就是能够获得当前元素的索引。

例如,有没有办法在n1ql中使用ARRAY简洁地执行此操作?

// returns [{x: 7, i: 0}, {x: 3, i: 1}]
[{x: 7}, {x: 3}].map((obj, i) => ({...obj, i}));

这样的东西将是一个很好的API:

SELECT ARRAY OBJECT_PUT(obj, "i", i) FOR obj, i IN [{x: 7}, {x: 3}] END

您可以在FOR之后定义两个变量:第一个是当前数组元素,第二个变量是当前数组索引。

有没有一种有效的方法可以轻松完成这项工作?

2 个答案:

答案 0 :(得分:1)

您可以使用ARRAY_POSITION()函数来获取索引。 https://developer.couchbase.com/documentation/server/4.6/n1ql/n1ql-language-reference/arrayfun.html#story-h2-15

并且,是的,可以在ARRAY构造中使用多个FOR表达式,它们可以一起迭代(即它们应该具有相同的大小)。 https://developer.couchbase.com/documentation/server/4.6/n1ql/n1ql-language-reference/collectionops.html

例如:

SELECT ARRAY {i, j} FOR i IN [10, 11, 12], j IN [0, 1, 2] END;
[
  {
    "$1": [
      {
        "i": 10,
        "j": 0
      },
      {
        "i": 11,
        "j": 1
      },
      {
        "i": 12,
        "j": 2
      }
    ]
  }
]

答案 1 :(得分:1)

SELECT ARRAY {" x":vx," i":ARRAY_POS([{" x":7},{" x&#34 ;:3}],v)} FOR v IN [{" x":7},{" x":3}] END;