枚举
编辑教程枚举
在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 | 可向数组的开头添加一个或更多元素,并返回新的长度 |
在列表上右侧的方法是Ember重写标准的JavaScript方法而得的,他们最大的不同之处是使用普通的方法( 左边部分)操作的数组不会在应用程序中自动更新(不会触发观察者), 而使用Ember重写过的方法则可以触发观察者,只要数据有变化Ember就可以观察到,并且更新到模板上。
常用API
数组迭代器
遍历数组元素使用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方法,转换数组,并且可以在回调函数里添加自己的逻辑
map方法会新建一个数组,并且返回被转换数组的元素
var arrMap = arr.map(function(item) {
return 'map: ' + item; // 增加自己的所需要的逻辑处理
});
arrMap.forEach(function(item, index) {
console.log(item);
});
console.log('-----------------------------------------------');
mapBy方法
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 过滤器方法,过滤普通数组元素 filter方法可以跟你指定的条件过滤掉不匹配的数据,比如下面的代码:过滤了元素大于4的元素
var nums = [1, 2, 3, 4, 5];
// 参数self值 数组本身
var numsTmp = nums.filter(function(item, index, self) {
return item < 4;
});
numsTmp.forEach(function(item, index) {
console.log('item = ' + item); // 1, 2, 3
});
console.log('-----------------------------------------------');
filter方法会返回所有判断为true的元素,会把判断结果为false或者undefined的元素过滤掉。
filterBy方法
根据对象的某个属性过滤数组需要用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('-----------------------------------------------');
filter和filterBy不同的地方是前者可以自定义过滤逻辑,后者可以直接使用。
7,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);
isEvery、isAny方法
与every、some类似的方法还有isEvery、isAny
console.log('isEvery = ' + people.isEvery('isHappy', true));
// 全部都为true,返回结果才是true
console.log('isAny = ' + people.isAny('isHappy', true));
//只要有一个为true,返回结果就是true
上述方法的使用与普通JavaScript提供的方法基本一致。
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间