Какова цель выражения в квадратных скобках после push-вызова массива?

Я работал над проблемой FreeCodeCamp, которая называется "9 миллиардов имен Бога-целого". (Специфика самой проблемы не имеет отношения к моему вопросу, но посмотрите на ссылку, если вам интересно.) Правда, я боролся с этой проблемой в течение нескольких дней, прежде чем сдаваться и гуглить ответ. Изначально проблема возникла из Rosetta Code, и я принялся за чтение ответа на JavaScript, чтобы убедиться, что я понял, как можно решить эту проблему.

Насколько я могу сказать, это делает расчеты с помощью старого доброго for циклы, и хотя он был опубликован с короткими, не описательными именами переменных, я думаю, что мог бы пройти через это. Тем не менее, вот часть, которая вводит меня в заблуждение (обратите внимание, что приведенный ниже код является исправленным воспроизведением решения Rosetta Code, в котором было много ненужных комментариев и несколько опечаток):

(function() {
  var cache = [
    [1]
  ];

  function cumu(n) {
    var r, l, x, Aa, Mi;
    for (l = cache.length; l < n + 1; l++) {
      r = [0];
      for (x = 1; x < l + 1; x++) {
        r.push(r[r.length - 1] + (Aa = cache[l - x < 0 ? cache.length - (l - x) : l - x])[(Mi = Math.min(x, l - x)) < 0 ? Aa.length - Mi : Mi]);
      }
      cache.push(r);
    }
    return cache[n];
  }

  function row(n) {
    var r = cumu(n),
      leArray = [],
      i;
    for (i = 0; i < n; i++) {
      leArray.push(r[i + 1] - r[i]);
    }
    return leArray;
  }

  console.log("Rows:");
  for (iterator = 1; iterator < 12; iterator++) {
    console.log(row(iterator));
  }

  console.log("Sums");
  [23, 123, 1234].forEach(function(a) {
    var s = cumu(a);
    console.log(a, s[s.length - 1]);
  });
})()

В частности, эта линия в cumu(n):

r.push(r[r.length - 1] + (Aa = cache[l - x < 0 ? cache.length - (l - x) : l - x])[(Mi = Math.min(x, l - x)) < 0 ? Aa.length - Mi : Mi]);

это push метод имеет [square brackets] после этого. Что это делает? Я знаю назначение скобок, поскольку они относятся к массивам и объектам, но я не могу найти никакой документации об этом использовании. Имейте в виду, что скрипт, кажется, работает так, как задумано, независимо от того, что результат выводится на консоль, как и ожидалось, и ошибок не возникает.

1 ответ

Решение
(Aa = cache[l - x < 0 ? cache.length - (l - x) : l - x]) 

возвращает массив как cache многомерный массив Это между скобками, потому что Aa должен быть установлен также.

Большая проблема этого кода в том, что его трудно читать. Было бы разумно открыть вашу IDE и реструктурировать код по частям. Тогда вы сможете лучше понять это.

Другие вопросы по тегам