推荐解决方案
我的建议是添加一个index 键
let data = {
"names": [
{"name": "John"},
{"name": "Mary"}
]
};
// Add an index manually
data = {
names: [
{ id: 0, name: "John" },
{ id: 1, name: "Mary" }
]
};
// Add an index with a loop
data = data.names.map(function (name, i) {
name.id = i;
return name;
});
// Nested arrays with indices (parentId, childId)
data = {
names: [{
parentId: 0,
name: "John",
friends: [{
childId: 0,
name: "Mary"
}]
}]
};
建议的 Mustache Index 解决方案存在的问题
其他建议的解决方案不那么干净,如下所述...
@Index
小胡子不支持@Index
IndexOf
这个解决方案在 O(n^2) 时间内运行,因此它没有最好的性能。此外,必须为每个列表手动创建索引。
const data = {
list: ['a', 'b', 'c'],
listIndex: function () {
return data.list.indexOf(this);
}
};
Mustache.render('{{#list}}{{listIndex}}{{/list}}', data);
全局变量
这个方案运行时间为O(n),所以这里性能更好,但也“污染了全局空间”(即给window对象添加属性,直到浏览器才被垃圾回收器释放内存窗口关闭),并且必须为每个列表手动创建索引。
const data = {
list: ['a', 'b', 'c'],
listIndex: function () {
return (++window.listIndex || (window.listIndex = 0));
}
};
Mustache.render('{{#list}}{{listIndex}}{{/list}}', data);
局部变量
此方案运行时间为 O(n),不会“污染全局空间”,也不需要为每个列表手动创建。但是,该解决方案很复杂,并且不适用于嵌套列表。
const data = {
listA: ['a', 'b', 'c'],
index: () => name => (++data[`${name}Index`] || (data[`${name}Index`] = 0))
};
Mustache.render('{{#listA}}{{#index}}listA{{/index}}{{/listA}}', data);