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
之后定义两个变量:第一个是当前数组元素,第二个变量是当前数组索引。
有没有一种有效的方法可以轻松完成这项工作?
答案 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;