在Ember
中,枚举是包含多个子对象的对象,并且提供了丰富的API(Ember.Enumerable API)去获取所包含的子对象。Ember
的枚举都是基于原生的javascript
数组实现的,Ember
扩展了其中的很多接口。
Ember
提供一个标准化接口处理枚举,并且允许开发者完全改变底层数据存储,而无需修改应用程序的数据访问代码。
Ember
的Enumerable API
尽可能的遵照ECMAScript
规范。为了减少与其他库不兼容,Ember
允许你使用本地浏览器实现数组。
下面是一些重要而常用的API
列表;请注意左右两列的不同。
标准方法 |
可被观察方法 |
说明 |
pop |
popObject |
该函数从从数组中删除最后项,并返回该删除项 |
push |
pushObject |
新增元素 |
reverse |
reverseObject |
颠倒数组元素 |
shift |
shiftObject |
把数组的第一个元素从其中删除,并返回第一个元素的值 |
unshift |
unshiftObject |
可向数组的开头添加一个或更多元素,并返回新的长度 |
详细文档请看:http://emberjs.com/api/classes/Ember.Enumerable.html
在列表上右侧的方法是Ember
重写标准的JavaScript
方法而得的,他们最大的不同之处是使用普通的方法(左边部分)操作的数组不会在你的应用程序中自动更新(不会触发观察者),而使用Ember
重写过的方法则可以触发观察者,只要你的数据有变化Ember
就可以观察到,并且更新到模板上。
常用API
1,数组迭代器
遍历数组元素使用forEach
方法。
1 2 3 4
| var arr = ['chen', 'ubuntuvm', '1527254027@qq.com', 'i2cao.xyz', 'ubuntuvim.xyz']; arr.forEach(function(item, index) { console.log(index+1 + ", " +item); });
|
2,获取数组首尾元素
1 2 3
| console.log('The firstItem is ' + arr.get('firstObject')); console.log('The lastItem is ' + arr.get('lastObject'));
|
3,map方法
1 2 3 4 5 6 7 8 9
|
var arrMap = arr.map(function(item) { return 'map: ' + item; }); arrMap.forEach(function(item, index) { console.log(item); }); console.log('-----------------------------------------------');
|
4,mapBy方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
var obj1 = Ember.Object.create({ username: '123', age: 25 }); var obj2 = Ember.Object.create({ username: 'name', age: 35 }); var obj3 = Ember.Object.create({ username: 'user', age: 40 }); var obj4 = Ember.Object.create({ age: 40 }); var arrObj = [obj1, obj2, obj3, obj4]; var tmp = arrObj.mapBy('username'); tmp.forEach(function(item, index) { console.log(index+1+", "+item); }); console.log('-----------------------------------------------');
|
5,filter方法
1 2 3 4 5 6 7 8 9 10 11 12
|
var nums = [1, 2, 3, 4, 5];
var numsTmp = nums.filter(function(item, index, self) { return item < 4; }); numsTmp.forEach(function(item, index) { console.log('item = ' + item); }); console.log('-----------------------------------------------');
|
filter
方法会返回所有判断为true
的元素,会把判断结果为false
或者undefined
的元素过滤掉。
6,filterBy方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| var o1 = Ember.Object.create({ name: 'u1', isDone: true }); var o2 = Ember.Object.create({ name: 'u2', isDone: false }); var o3 = Ember.Object.create({ name: 'u3', isDone: true }); var o4 = Ember.Object.create({ name: 'u4', isDone: true }); var todos = [o1, o2, o3, o4]; var isDoneArr = todos.filterBy('isDone', true); isDoneArr.forEach(function(item, index) { console.log('name = ' + item.get('name') + ', isDone = ' + item.get('isDone')); }); console.log('-----------------------------------------------');
|
filter
和filterBy
不同的地方是前者可以自定义过滤逻辑,后者可以直接使用。
7,every、some方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
Person = Ember.Object.extend({ name: null, isHappy: true }); var people = [ Person.create({ name: 'chen', isHappy: true }), Person.create({ name: 'ubuntuvim', isHappy: false }), Person.create({ name: 'i2cao.xyz', isHappy: true }), Person.create({ name: '123', isHappy: false }), Person.create({ name: 'ibeginner.sinaapp.com', isHappy: false }) ]; var every = people.every(function(person, index, self) { if (person.get('isHappy')) return true; }); console.log('every = ' + every); var some = people.some(function(person, index, self) { if (person.get('isHappy')) return true; }); console.log('some = ' + some);
|
8,isEvery、isAny方法
1 2 3
| console.log('isEvery = ' + people.isEvery('isHappy', true)); console.log('isAny = ' + people.isAny('isHappy', true));
|
上述方法的使用与普通JavaScript
提供的方法基本一致。学习难度不大⋯⋯自己敲两边就懂了!
这些方法非常重要,请一定要学会如何使用!!!
博文完整代码放在Github(博文经过多次修改,博文上的代码与github代码可能又出入,不过影响不大!),如果你觉得博文对你有点用在github项目上给我个star
吧。您的肯定对我来说是最大的动力!!