2016-02-22 3 views
3

Есть ли способ пропустить инициализацию массива в ES6? Я должен перечислить ниже R дважды, сначала для инициализации счетчиков, а затем для фактического подсчета элементов A. Я предпочел бы сделать одно перечислениеКак инициализировать массивы в ES6/ES2015?

var A = ['red',1,'blue','red',1]; // test data 

    var R = []; //associative array keeping count of A values 

    A.map((item)=> R[item]=0); //initialize R with A elements as R indexes 
    A.map((item)=> R[item]++); //count repeated A elelemnts in R 
+0

В качестве индексов массива используются не только числа. Хотя это возможно в Javascript, было бы лучше использовать для него объект: 'var R = {}'. Массивы со строковыми клавишами очень сложны, вы не можете использовать '.forEach' и другие функции, они будут пропускать ваши строковые ключи. –

ответ

2

Вам не нужно инициализировать, вы могли бы сделать что-то вроде этого:

A.forEach((val) => { 
    if (R[val]) { 
    R[val] += 1 
    } else { 
    R[val] = 1 
    } 
}); 
+0

О, да, на основе твоего я смог построить мой один лайнер: A.map ((item) => R [item]? R [item] + = 1: R [item] = 1); – irom

+0

Я думаю, что мой был более разборчивым;) – mikl

+1

Кроме того, если вы не используете возвращаемое значение, вы должны использовать forEach, а не карту, поскольку карта теоретически тратит ресурсы, отслеживая возвращаемое значение каждой итерации и генерируя массив из них , – mikl

3

Так много способов подойти к этому по-другому ... Вот один:

R = A.reduce(function (R, item) { 
    R[item] = (R[item] || 0) + 1; 
    return R; 
}, {}); 
1

Есть ли способ пропустить инициализацию массива в ES6?

Нет, не существует. Вам всегда нужно объявить и инициализировать переменную в javascript. Между не существует различий и esnext (outside from strict-mode you can skip the declaration, but isn't a good practice).

Я не понял, что вы пытаетесь сделать ... Кажется, что вы подсчитываете каждый экземпляр данного элемента в коллекции.

Если вы хотите, чтобы сделать это, вы должны использовать ассоциативный массив вместо indexeed массива:

var collection = [1, 2, 3, 4, 'me', 'you', 'she', 'me', 'you', 1]; 
 
var count = {}; 
 

 
collection.forEach(item => (count[item] = 1 + (count[item] || 0)));

Вы должны иметь в виду, что ассоциативные массивы индексируются по строке, поэтому вы не можете иметь «сложные типы» в своей коллекции (например, массивы), даже, я думаю, число преобразуется в строку. В ES6 вы должны использовать Map для решения этой проблемы.