JS Примените Array Prototype "indexOf" и "splice" к объекту вместо массива - PullRequest
0 голосов
/ 17 апреля 2019

У нас есть простой объект с методами

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 методов к объекту?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Если вы дадите объекту свойство length, вы можете взломать методы массива через заднюю дверь. Я подозреваю, что никто бы на самом деле не посоветовал сделать это, но способ написания спецификации JS для поиска length и итерации последовательных чисел, многие из этих методов будут работать:

let o = {
  "0" : "zero",
  "1" : "one",
  length: 3,
  fn  : (a)=>{},
  "2" : "Two",
}

console.log(Array.prototype.slice.call(o, 1))

console.log(Array.prototype.indexOf.call(o, "Two"))

Array.prototype.splice.call(o, 1, 0, "Three")
// spliced in and adjusted length
console.log(o)
2 голосов
/ 17 апреля 2019

Вы можете взять 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...