推荐解决方案
我的建议是添加一个
index
键。
let data = {
"names": [
{"name": "John"},
{"name": "Mary"}
]
};
data = {
names: [
{ index: 0, name: "John" },
{ index: 1, name: "Mary" }
]
};
data = data.names.map((name, index) => name.index = index);
data = {
names: [{
parentIndex: 0,
name: "John",
friends: [{
childIndex: 0,
name: "Mary"
}]
}]
};
提议的胡子指数解决方案存在问题。
其他提出的解决方案并不如下所述那样简洁...
@Index
Mustache 不支持 @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);
Mustache.render('{{#list}}{{index}}{{/list}}', { list: ['a', 'b', 'c' ], index: () => (++this.i || (this.i = 0)) });
- tim-montague