2016-08-11 2 views
0

Я пытаюсь получить набор классов, связанных с разными ширинами окон. Эти пары от класса к ширине устанавливаются пользователем. Однако я не могу найти правильную структуру данных для ее хранения. Я считаю, что кортеж был бы оптимальным типом, но, видимо, they don't exist in javascript. Если бы они сделали мои данные были бы выглядеть следующим образом:Структура данных Javascript: набор ширины страницы со связанными значениями

var pageBreaks = [(900, "foo"), (600, "bar")]; 

Где в 900px я мог бы применить класс «Foo». 600px Я могу применить «бар». Мне нужно иметь доступ к «ключу» и «значению» в цикле .each().

Я мог бы использовать вложенные массивы, такие как var pageBreaks = [[900, "foo"], [600, "bar"]];, но я думаю, что это очень уродливо, особенно пытаясь заставить пользователей моего плагина принять формат.

Объект можно:

var pageBreaks = { 
    900 : "foo", 
    600 : "bar", 
} 

Но было бы более запутанна, чтобы перебрать и было бы легче обрабатывать, если я держу его заказал самый большой по крайней мере, не гарантируется в объекте (справа ?).

Итак, какова была бы лучшая структура данных для обработки этого массива пар «значение-значение» с двумя сторонами, доступными в цикле?

+2

Почему вы не делаете инверсию? '{" foo ": 900," bar ": 600}' – Hydro

+0

Затем используйте '[tuple (900," foo "), tuple (600," bar ")]' где 'tuple = Array' – Bergi

+0

Не могли бы вы просто сделать это с помощью CSS и изменить стиль элемента в точке останова в зависимости от его базового класса? Похоже, что ненужная обработка для Javascript – Alex

ответ

1

Map может быть хорошим подходом, если у вас есть доступ к новой JS синтаксису:

let pageWidths = new Map(); 
pageWidths.set(900, "foo"); 
pageWidths.set(600, "bar"); 

// ordered 
const orderedWidths = new Map([...pageWidths.entries()].sort()); 

// iteration with forEach 
orderedWidths.forEach(console.log.bind(console)); 

// iteration with for...of 
for (var [key, value] of orderedWidths) { 
    console.log(key, value); 
} 

Несмотря на то, что не будет поддерживать порядок на своем собственном (без встроенной структуры данных JS будет делать это для вас *), Карты довольно легко работать и легко достигать ваших целей.

* если вы не используете массивы с целым PageWidth в качестве индекса, но даже это потребует немного работы, чтобы отфильтровать undefined элементов между ними

1

Вы можете использовать структуру HashMap данных для достижения этой цели здесь , Я написал (пишет) библиотеку структуры данных в JavaScript и уже закончил Hashmap portion, если вы заинтересованы в ее использовании.

Вы можете хранить пары ключ-значение (или в вашем случае, пары значение-значение) и прокручивать их в том же порядке, в котором они были вставлены.

const Hashmap = require('node-needle').Hashmap; 

var map = new Hashmap(); 

map.put(900, "foo"); 
map.put(600, "bar"); 
// ... 

// Iterate through map - insertion order is kept 
for(var it = map.iterator(); it !== null; it = map.next()){ 
    console.log(it);   // 900 -> 600 -> ... 
    console.log(map.get(it)); // "foo" -> "bar" -> ... 
} 
Смежные вопросы