2016-07-28 5 views
-2

Предположим, что у меня есть массив как a=[1,3,4,{roll:3},7,8,{roll:2},9] и я хочу два массива со следующим содержимым:JavaScript - Отдельный смешанный массив в соответствующие типы

b=[1,3,4,7,8,9]

c=[{roll:3},{roll:2}].

Как отделить содержимое массива?

+5

Вы должны иметь лучшие названия, и пытались ли вы что-нибудь? –

ответ

1

Вы можете отделить массив, сравнив типы данных, так как {roll:2} имеет тип object и цифры имеют тип number.

var numbers = []; 
var rolls = []; 
for (var i = 0; i < a.length; i++) { 
    if (typeof a[i] === 'object') 
    rolls.push(a[i]); 
    else 
    numbers.push(a[i]); 
} 
1
var a=[1,3,4,{roll:3},7,8,{roll:2},9]; 

var numbers = []; 
var objs = []; 
for(var item in a) 
{ 
    if(typeof a[item] !== 'number') 
    { 
     objs.push(a[item]); 
    } 
    else{ 
     numbers.push(a[item]); 
    } 
} 

console.log (numbers); 
console.log(obj); 
1

Вы можете использовать функцию яваскрипта массив reduce, как показано ниже

var a = [1, 3, 4, { 
    roll: 3 
}, 7, 8, { 
    roll: 2 
}, 9]; 


var result = a.reduce(function(res, item) { 
    if (typeof item === 'object') { 
     res.c.push(item); 
    } else { 
     res.b.push(item); 
    } 
    return res; 
}, { 
    b: [], 
    c: [] 
}); 

console.log(result.b); 
console.log(result.c); 
0

Вы хотите, чтобы фильтровать исходный массив.

var a = [ 1 , 3 , 4 , {roll:3} , 7 , 8 , {roll:2} , 9 ]; 
var b = a.filter(function(element) { return Number(element) === element; }); 
var c = a.filter(function(element) { return Number(element) !== element; }); 

Суть в том, как различать два вида элементов массива: тест я мог бы перефразировать как «если отливка элемента в номер производит сам элемент, это число». Обнаружение типа в javascript - это классно чреватый проект, и я не буду вдаваться в него здесь; см. Douglas Crockford's Javascript: хорошие детали для расширенного обсуждения темы с отличным примером кода. Основываясь на типах элементов, которые вы ожидаете найти в своем массиве, вам может потребоваться выбрать более сложный дискриминатор. Вы легко можете проверить эти вещи в javascript-консоли браузера. Я сделал это, чтобы проверить мой тест:

> Number(4) === 4 
< true 

-

Этот подход перебирает исходного массива в два раза. Если вы заботитесь о производительности - это будет проблемой только в том случае, если исходный массив содержит десятки тысяч элементов в нем или если ваш тест очень дорог, то вы можете выполнить тот же результат с помощью forEach, который проверяет каждый элемент и присоединяет его к одному из двух выходных массивов (или reduce, который испускает что-то вроде { numbers: [], items: {}}).

-

META: ваш заголовок не велик. Если вы не приложите некоторые усилия к своим вопросам, вы не должны ожидать больших усилий в форме ответов. Мы все делаем из доброты наших чистокровных буррито. ;)

0

Вы можете использовать один цикл с Array#forEach и нажимать в соответствии с типом элемента.

var a = [1, 3, 4, { roll: 3 }, 7, 8, { roll: 2 }, 9], 
 
    b = [], 
 
    c = []; 
 

 
a.forEach(function (el) { 
 
    (typeof el === 'object' ? c : b).push(el); 
 
}); 
 
console.log(b); 
 
console.log(c);

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