2016-07-02 2 views
0

Можно ли преобразовать объект в массив, если он имеет эту структуру, а все поля игнорируются, у которых есть поле без номера?Преобразование объекта в массив при удалении имен не числовых полей

var obj = { 
    0: 'some', 
    1: 'thing', 
    2: 'to convert', 
    ignore: 'this' 
} 

результат должен быть:

result = ['some', 'thing', 'to convert']; 

с правильным порядком элементов.

+2

Есть ли у него 'length' недвижимость? – MinusFour

+0

Что такое отрицательные ключи или фракции? или разреженный массив? –

+0

Замечание, являющееся численным, недостаточно, чтобы быть индексом массива. '' '', '" -0 "', '" 0 "', '" 1.2 "', '" 4294967295 "' '' '' 'Infinity '' не являются индексами массива. – Oriol

ответ

4

Если он имеет length свойство можно использовать Array.from:

console.log(Array.from({ 
 
    0: 'some', 
 
    1: 'thing', 
 
    2: 'to convert', 
 
    length: 3, 
 
    ignore: 'this' 
 
}));

В противном случае, если предположить, что индексы не разреженный, вы можете выполнять итерацию вручную. Начните с 0 и увеличивайте до тех пор, пока не достигнете конца.

var obj = { 
 
    0: 'some', 
 
    1: 'thing', 
 
    2: 'to convert', 
 
    ignore: 'this' 
 
}, array = [], i = -1; 
 
while(++i in obj) array[i] = obj[i]; 
 
console.log(array);

В общем, вам нужно будет перебирать все свойства строки и check if they are array indices:

function isArrayIndex(str) { 
 
    return (str >>> 0) + '' === str && str < 4294967295 
 
} 
 
var obj = { 
 
    0: 'some', 
 
    1: 'thing', 
 
    2: 'to convert', 
 
    ignore: 'this' 
 
}, array = []; 
 
for(var key of Object.keys(obj)) 
 
    if(isArrayIndex(key)) array[key] = obj[key]; 
 
console.log(array);

+0

. Какое хорошее объяснение;) Я не знал Array.from() – ClementNerma

0

Более быстрый, но более сложный путь:

var obj = { 
    0: 'some', 
    1: 'thing', 
    2: 'to convert', 
    ignore: 'this' 
}, res = [], keys = Object.getOwnPropertyNames(obj); 

for(var i = 0; i < keys.length; i++) 
    if(!isNaN(+keys[i])) 
    res.push(obj[keys[i]]); 
+1

'isNaN' не является правильным способом проверки индексов массива. – Oriol

+0

Эта функция предназначена для проверки того, является ли массив числом не – ClementNerma

-1

Вы можете сделать что-то вроде этого:

var obj = { 
 
    0: 'some', 
 
    1: 'thing', 
 
    2: 'to convert', 
 
    ignore: 'this' 
 
}; 
 

 
var copy = {}; 
 

 
Object.keys(obj).forEach(e=>{ 
 
    if(!isNaN(e)) copy[e] = obj[e]; 
 
}); 
 

 
console.log(Object.values(copy));

+0

Может ли downvoter объяснить, что не так? –

+0

Свершитель (а не я) мог подумать, что вместо копирования всех свойств и удаления нечисловых, было бы лучше скопировать только нужные. – Oriol

+0

@Oriol Благодарим вас за ввод! теперь исправлено! –

Смежные вопросы