首页 > 解决方案 > 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在对象上应用方法?

标签: javascriptarraysobject

解决方案


您可以将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);


推荐阅读