标签:
本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站。
在Ember中,枚举是包括若干子对象的对象,并且提供了很多的Ember.Enumerable API获取所包含的子对象。我们常见的枚举都是基于原生的javascript数组实现的,Ember扩展了其中的很多接口。
Ember提供一个标准化接口处理枚举,并且允许开发者完全改变底层数据存储,而无需修改应用程序的其他部分去访问它。
Ember的Enumerable API尽可能的遵照ECMAScript规范。为了减少与其他库不兼容Ember.js允许你使用本地浏览器实现数组。
下面是一些重用的API列表;请注意左右两列的不同。
标准方法 |
可被观察方法 |
说明 |
pop |
popObject |
该函数从从数组中删除最后项,并返回该删除项。 |
push |
pushObject |
新增元素 |
reverse |
reverseObject |
颠倒数组元素 |
shift |
shiftObject |
把数组的第一个元素从其中删除,并返回第一个元素的值 |
unshift |
unshiftObject |
可向数组的开头添加一个或更多元素,并返回新的长度。 |
详细文档请看:http://emberjs.com/api/classes/Ember.Enumerable.html
在列表上右侧的方法是Ember重写标准的JavaScript方法而得的,他们最大的不同之处是使用普通的方法(左边部分)操作的数组不会在你的应用程序中自动更新(不会触发观察者),而使用Ember重写过的方法则可以触发观察者,只要你的数据有变化Ember就可以观察到。
遍历数组元素使用forEach方法。
var arr = [‘chen‘, ‘ubuntuvm‘, ‘1527254027@qq.com‘, ‘i2cao.xyz‘, ‘ubuntuvim.xyz‘]; arr.forEach(function(item, index) { console.log(index+1 + ", " +item); });
// 获取头尾的元素,直接调用Ember封装好的firstObject和lastObject方法即可 console.log(‘The firstItem is ‘ + arr.get(‘firstObject‘)); // output> chen console.log(‘The lastItem is ‘ + arr.get(‘lastObject‘)); //output> ubuntuvim.xyz
// map方法,转换数组,并且可以在回调函数里添加自己的逻辑 // map方法会新建一个数组,并且返回被转换数组的元素 var arrMap = arr.map(function(item) { return ‘map: ‘ + item; // 增加自己的所需要的逻辑处理 }); arrMap.forEach(function(item, index) { console.log(item); }); console.log(‘-----------------------------------------------‘);
// mapBy 方法:返回对象属性的集合, // 当你的数组元素是一个对象的时候,你可以根据对象的属性名获取对应值 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(‘-----------------------------------------------‘);
// filter 过滤器方法,过滤普通数组元素 // filter方法可以跟你指定的条件过滤掉不匹配的数据,比如下面的代码:过滤了元素大于4的元素 var nums = [1, 2, 3, 4, 5]; // 参数self值数组本身 var numsTmp = nums.filter(function(item, index, self) { if (item < 4) return true; }); numsTmp.forEach(function(item, index) { console.log(‘item = ‘ + item); // 1, 2, 3 }); console.log(‘-----------------------------------------------‘);
// 如果你想根据对象的某个属性过滤数组你需要用filterBy方法,比如下面的代码根据isDone这个对象属性过滤 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); //会把o2过滤掉 isDoneArr.forEach(function(item, index) { console.log(‘name = ‘ + item.get(‘name‘) + ‘, isDone = ‘ + item.get(‘isDone‘)); // console.log(item); }); console.log(‘-----------------------------------------------‘);
// find和findBy方法,这两个方法都是只返回第一个匹配的元素,与filter和filterBy类似,一个用于返回普通的元素,一个可以用于对象属性判断 var firstNum = nums.find(function(item, index, seft){ return item < 4; }); console.log(‘firstNum = ‘ + firstNum); var firstObjAttr = todos.findBy(‘isDone‘, true); console.log(‘name = ‘ + firstObjAttr.get(‘name‘) + ‘, isDone = ‘ + firstObjAttr.get(‘isDone‘)); console.log(‘-----------------------------------------------‘);
// every、some 方法 // every 用于判断数组的所有元素是否符合条件,如果所有元素都符合指定的判断条件则返回true,否则返回false // some 用于判断数组的所有元素只要有一个元素符合条件就返回true,否则返回false 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);
// 与every、some类似的方法还有isEvery、isAny console.log(‘isEvery = ‘ + people.isEvery(‘isHappy‘, true)); // 全部都为true,返回结果才是true console.log(‘isAny = ‘ + people.isAny(‘isHappy‘, true)); //只要有一个为true,返回结果就是true
上述方法的条用与其他JS框架提供的方法基本相似的。学习难度不大……
Ember.js 入门指南——枚举(enumerables)
标签:
原文地址:http://my.oschina.net/u/565401/blog/504127