Arhn - архитектура программирования

Как лучше всего (разрешено ES6) извлекать значения из массива и преобразовывать их в строку?

Я пытаюсь взять такой массив:

location: [
  {Id: "000-000", Name: "Foo"}, 
  {Id: "000-001", Name: "Bar"}, 
  ..etc
]

Каков наиболее эффективный/чистый способ извлечь идентификаторы и объединить их в одну строку, а также добавить перед каждым значением статическую строку ("& myId=")?

Более кратко, какой самый эффективный способ превратить приведенный выше массив в следующий конечный результат:

&myId=000-000&myId=000-001

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


Ответы:


1

Используйте reduce, извлекая каждый Id:

const location2 = [{Id: "000-000", Name: "Foo"}, {Id: "000-001", Name: "Bar"}];
console.log(
  location2.reduce((a, { Id }) => `${a}&myId=${Id}`, '')
);

Хотя это довольно чисто и требует только однократного повторения каждого элемента, с точки зрения эффективности циклы for все же более эффективны, если у вас есть огромное количество элементов в массиве:

const location2 = [{Id: "000-000", Name: "Foo"}, {Id: "000-001", Name: "Bar"}];
let output = '';
for (let i = 0, { length } = location2; i < length; i++) {
  output += '&myId=' + location2[i].Id;
}
console.log(output);

29.06.2018
  • Эффективность и чистота здесь могут противоречить друг другу. Это чисто. Не уверен в эффективности, так как он создает новую строку N раз. Думаю, зависит от того, что ОП подразумевает под этими фразами. 29.06.2018
  • Чтобы уточнить эффективность и чистоту, я думаю, я бы перефразировал, сказав, что ищу лучший баланс читабельности/ясности кода, удобства обслуживания и скорости. Я понимаю, что это может быть субъективным для каждого человека, поэтому любое объяснение того, почему вы считаете, что один лучше другого, всегда полезен (как для других, так и для меня). 29.06.2018
  • @star-coder Я предпочитаю reduce map / join, потому что reduce не требует создания промежуточного массива, и я предпочитаю reduce for, потому что методы массива имеют лучшую абстракцию и не требуют ручной итерации. 29.06.2018
  • С другой стороны, повторная конкатенация составляет O (n ^ 2) по сравнению с O (n) для join. 29.06.2018
  • @star-coder я с тобой. Я занимаюсь программированием уже 40 лет, но все еще нахожу многие умные способы использования reduce сбивающими с толку и редко рекомендую их в решениях, ориентированных на новичков. Но каждому свое. 29.06.2018
  • @Barmar Повторная конкатенация, например, что делает мой код? Я не понимаю, как это будет O (n ^ 2), для каждого элемента в массиве он извлекает значение из свойства Id и объединяет его с существующей (единственной, примитивной) строкой-аккумулятором/выходом для создания другого (единственного числа ) нить. На каждой итерации он запускает некоторый код O(1), верно? 29.06.2018
  • Одна конкатенация — это O(n), так как она должна скопировать две входные строки в результат. Выполнение этого каждый раз в цикле делает его O (n ^ 2). 29.06.2018
  • @CertainPerformance В целях безопасности было бы лучше использовать encodeURLComponent и для этих значений. 29.06.2018
  • @Barmar Повторная конкатенация является проблемой только в том случае, если вы предполагаете, что единственное доступное представление строки - это плоский список символов, что не так. Все распространенные движки JS используют веревки и сглаживают строки только при использовании операций на основе индексов. При том, что этот код на современных движках будет O(n). 29.06.2018
  • @loganfsmyth Спасибо, мне пришлось это поискать, это очень круто и имеет большой смысл. 29.06.2018

  • 2

    Использование map и join кажется достаточно эффективным.

    const staticString = "&myId=",
      locationArray = [
        {
          Id: "000-000",
          Name: "Foo"
        },
        {
          Id: "000-001",
          Name: "Bar"
        }
      ],
      result = locationArray.map(({Id}) => staticString + Id).join("");
    
    // or
    // result = staticString + locationArray.map(({Id}) => Id).join(staticString);
    
    console.log(result);

    В качестве альтернативы первый staticString также может быть изменен на "?myId=", так как это похоже на параметры запроса.

    29.06.2018
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..