underscore Objects



和 Array 类似,underscore 也提供了大量针对 Object 的函数。

keys() / allKeys()

keys() 可以非常方便地返回一个 object 自身所有的 key,但不包含从原型链继承下来的:

'use strict';
function Student(name, age) {
    this.name = name;
    this.age = age;
}
var xiaoming = new Student('小明', 20);
_.keys(xiaoming); // ['name', 'age']

allKeys() 除了 object 自身的 key,还包含从原型链继承下来的:

'use strict';
function Student(name, age) {
    this.name = name;
    this.age = age;
}
Student.prototype.school = 'No.1 Middle School';
var xiaoming = new Student('小明', 20);
_.allKeys(xiaoming); // ['name', 'age', 'school']

values()

keys() 类似,values() 返回 object 自身但不包含原型链继承的所有值:

'use strict';
var obj = {
    name: '小明',
    age: 20
};
_.values(obj); // ['小明', 20]

注意,[word-green]没有 allValues()[/word-green],原因我也不知道。

mapObject()

mapObject() 就是针对 object 的 map 版本:

'use strict';
var obj = { a: 1, b: 2, c: 3 };
// 注意传入的函数签名,value在前,key在后:
_.mapObject(obj, (v, k) => 100 + v); // { a: 101, b: 102, c: 103 }

invert()

invert() 把 object 的每个 key-value 来个交换,key 变成 value,value 变成 key:

'use strict';
var obj = {
    Adam: 90,
    Lisa: 85,
    Bart: 59
};
_.invert(obj); // { '59': 'Bart', '85': 'Lisa', '90': 'Adam' }

extend() / extendOwn()

extend() 把多个 object 的 key-value 合并到第一个 object 并返回:

'use strict';
var a = {name: 'Bob', age: 20};
_.extend(a, {age: 15}, {age: 88, city: 'Beijing'}); // {name: 'Bob', age: 88, city: 'Beijing'}
// 变量a的内容也改变了:
a; // {name: 'Bob', age: 88, city: 'Beijing'}

注意:[word-green]如果有相同的 key,后面的 object 的 value 将覆盖前面的 object 的 value[/word-green]。
extendOwn()extend() 类似,但获取属性时忽略从原型链继承下来的属性。

clone()

如果我们要复制一个 object 对象,就可以用 clone() 方法,它会把原有对象的所有属性都复制到新的对象中:

'use strict';
var source = {
    name: '小明',
    age: 20,
    skills: ['JavaScript', 'CSS', 'HTML']
};
var copied = _.clone(source);
alert(JSON.stringify(copied, null, '  '));

注意,[word-green]clone() 是“浅复制”。所谓“浅复制”就是说,两个对象相同的 key 所引用的 value 其实是同一对象[/word-green]:

source.skills === copied.skills; // true

也就是说,修改 source.skills 会影响 copied.skills

isEqual()

isEqual() 对两个 object 进行深度比较,如果内容完全相同,则返回 true:

'use strict';
var o1 = { name: 'Bob', skills: { Java: 90, JavaScript: 99 }};
var o2 = { name: 'Bob', skills: { JavaScript: 99, Java: 90 }};
o1 === o2; // false
_.isEqual(o1, o2); // true

isEqual() 其实对 Array 也可以比较:

'use strict';
var o1 = ['Bob', { skills: ['Java', 'JavaScript'] }];
var o2 = ['Bob', { skills: ['Java', 'JavaScript'] }];
o1 === o2; // false
_.isEqual(o1, o2); // true

更多完整的函数请参考 underscore 的文档。


<< underscore Functions 函数的扩充 underscore Chaining >>
工作中
  • 作者 建站迷

    建站迷

    让天下没有难做的网站!
    解决中小型企业的无站之伤。



没有账号? 忘记密码?

社交账号快速登录