Array.prototype.map.bind与对象一起使用是否可靠
Is Array.prototype.map.bind reliable to use with objects?
我喜欢Array.prototype.map方法,不久前我遇到了一个意想不到的用法。
var xargByID = { a: 1, b: 2 };
Array.prototype.map.bind(xargByID)(function (xarg) {
});
我不知道Array.prototype.map内部是如何工作的,所以我不得不问,它可靠吗?它会随着时间而断裂吗?
它根本不起作用。只能对具有以0开头的数字属性并具有相应长度属性的对象调用Array.map
。所以只有这一点会起作用:
var xargByID = {0: 'first', 1: 'second', 2: 'third', length: 3};
Array.prototype.map.bind(xargByID)(function (xarg) {
console.log(xarg);
});
这是因为.map()
在内部执行类似于以下模拟的操作:
function simulateMap(callback, thisArg) {
var ret = [], length = this.length, that = thisArg || this;
for (var i = 0; i < length; i++) {
ret.push(callback.call(that, this[i], i, this));
}
return ret;
}
与.forEach()
、.some()
等相同
编辑但如果你非常喜欢.map()
,你可以做:
var xargByID = { a: 1, b: 2, c: 3};
Object.getOwnPropertyNames(xargByID).map(function(xarg, i, arr) {
console.log(xarg, arr[i]);
});
首先,.bind
绝对不是编写示例的最佳方式,最好是Array.prototype.map.call(xargByID, function (xarg) {
。
只要对象是类似数组的,它就会工作:它有一个整数>=0的length
属性,并且要迭代的元素位于整数>=0和<长度。这不是一个黑客,它是故意的;Array.prototype.map
可以用于非Array
对象,只要它们具有类似Array
的形式
在您的示例中,它不起作用,因为属性不在数字索引处,并且没有长度属性。但是,如果xArgByID是,例如,这个:{0: 'a', 1: 'b', length: 2}
,它就会起作用。
我知道这并不能回答您问题的可靠性方面,但如果您可以访问像lodash这样的库,那么您可以使用它的map函数来迭代对象。此是可靠的。
_.map(集合,[iteratee=_.identity])
通过iteratee运行集合中的每个元素来创建一个值数组。iteratee由三个参数调用:(值,索引|键,集合)。
根据您想要做的具体操作,您可能还需要考虑_.forOwn()
、_.forIn()
和_.forEach()
方法。它们还迭代对象中的属性。
编辑:根据cortopy在下面的评论,我已经更新了这个答案,使其对lodash 4.x准确
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 是否可以将Windows VisualSVN存储库与MAC客户端一起使用
- 是否可以将滚动条系在一起
- 将 Object.defineProperties 与符号一起使用是否有效
- 是否可以将相同属性的元素与 querySelectorAll 组合在一起
- 是否可以将 .val 与类一起使用
- 是否可以将动画与 jQuery 中的属性一起使用
- 是否可以将多个Chrome扩展程序打包在一起
- http_only cookie 是否会与 AJAX 一起发送
- 是否可以在 javascript 中将对象的默认方法与其他方法一起使用
- Reg Ex 不会验证我是否将 # 与其他字符或数字一起使用
- 是否可以在javascript中将for循环与setTimeOut组合在一起
- 是否可以将jQuery日期选择器与“onchange”事件一起使用
- MSoft是否为服务器端错误插件或工具提供持久的客户端错误报告,以便与MVC3应用程序一起使用
- jQuery或其他第三方库是否应该与逻辑代码捆绑在一起
- Array.prototype.map.bind与对象一起使用是否可靠
- 如何检查复选框是否与Protractor、CucumberJS和Chai一起选中
- Node.js是否可以具有与PHP相同的功能,或者它们应该一起使用
- 是否可以将Harmony(ES6)与JSXTransformer.js一起使用
- 这是否可以将迁移与bookbookf.js一起使用