A small function to convert an array of ID strings into a dictionary of jQuery objects

A small function to convert an array of ID strings into a dictionary of jQuery objects

I often use jQuery to modify the DOM. The simplest way to do this is to use jQuery’s query selector and a modifier function.

$('#intro').css('background-color', 'green');

Photo by [Kalliop3](https://cdn.hashnode.com/res/hashnode/image/upload/v1627409710288/dDfrmP1d_.html) under [CC BY-SA 2.0](https://creativecommons.org/licenses/by-sa/2.0/)Photo by Kalliop3 under CC BY-SA 2.0

If you have to perform multiple actions on the same element, you can keep using this selector.

$('#intro').css('background-color', 'green');

// Later...

$('#intro').hide();

Instead of searching the DOM every time we want to access this element, it is much more efficient to search for it once and store it in a variable.

var intro = $('#intro');

intro.css('background-color', 'green');

// Later...

intro.hide();

If you have many elements to access…

var intro = $('#intro');
var header = $('#header');
var button = $('#button');
var form = $('#form');
var alert = $('#alert');
var footer = $('#footer');
// etc...

it may be wise to put them all into a “dictionary” object.

var dom = {
  intro: $('#intro'),
  header: $('#header'),
  button: $('#button'),
  form: $('#form'),
  alert: $('#alert'),
  footer: $('#footer'),
  /// etc...
};

This way they can be accessed by dot (or bracket) notation from the main object.

dom.intro.css('background-color', 'green');
dom.header.hide();

dom['outro'].text('Goodbye.');
dom['alert'].show();

Writing the dictionary seems inefficient because there’s a lot of duplicated words. As long as your element IDs are also valid JavaScript variable names, we can automatically convert the IDs into variables with a small function.

The idsToJqObjects function

var idsToJqObjects = function(arr) {
  return arr
    .reduce(function addJqToObject(obj, newKey) {
      obj[newKey] = $('#' + newKey);
      return obj;
    }, {});
};

Use it in this way:

var dom = idstoJqObjects([
  'intro',
  'header',
  'button',
  'form',
  'alert',
  'footer',
  // etc...
]);

Your jQuery objects can be accessed with the same dot or bracket notation as before, without having to write duplicate code for each ID/variable.