javascript - JS 在对象而不是数组上应用数组原型“indexOf”和“splice”
问题描述
我们有一个带有方法的简单对象
var o = {
fn : (a)=>{}
}
我们然后向它添加数字索引子对象
o[0] = {};
o[1] = {};
所以现在我们混合了方法和数值属性
o = {
"0" : {}...
"1" : {}...
fn : (a)=>{}
}
由于各种原因,这很有帮助......在 JS 中似乎完全合法且可能。
我们更喜欢带有数字属性的对象,而不是带有方法的数组。
问题:有没有办法获得 indexOf、splice、各种Array.prototype
方法来处理这个?
我们尝试过类似的东西:
[].indexOf.call(o,_index) // didn't work
...
唯一的解决方案是将我们的对象构造为一个数组,并为其附加方法吗?或者也许还有另一种方法可以Array.prototype
在对象上应用方法?
解决方案
您可以将Object.assign
数组作为目标。结果是一个包含所有数组方法的数组。
var o = { 0: 'foo', 1: 'bar', fn: a => {} };
console.log(Object.assign([], o).indexOf('bar'));
对于 IE,您可以减少密钥。
var o = { 0: 'foo', 1: 'bar', fn: a => {}, '1.1': 'wrong', '-1': 'wrong', 1e10: 'wrong' },
array = Object.keys(o).reduce((r, i) => {
if (isNaN(i) || +i < 0 || +i !== +i | 0) return r;
r[i] = o[i];
return r;
}, []);
console.log(array.indexOf('bar'));
console.log(array);
推荐阅读
- c# - C# 源代码生成器不包括来自项目参考的结果
- kotlin-multiplatform - 在集成到 iOS 的 Xcode 中时,在 Kotlin Multiplatform 移动设备上的网络调用所花费的时间大约是原生的 6-7 倍
- javascript - 使用 JavaScript 事件间接更改播放按钮样式
- facebook - 无法触发 facebook webhook 测试
- c# - 无法隐式转换类型错误:例如。基本进程
= 新的 DeriveProcess1() - corda - 用于传入和传出消息的中间 Corda 节点
- python - 如何为列中的单元格着色?熊猫,pygsheets
- skywalking - .Net Core如何获取traceId Skywalking
- c++ - 如何使用 MINGW 编译“Windows 的 POSIX 线程”
- django - 使用 Django 中的中间表过滤标记的博客文章