Функция, возвращающая объект вместо массива, не может .Map - PullRequest
0 голосов
/ 07 августа 2020

Я анализирую фид заказов, чтобы выявить повторяющиеся купленные товары и сгруппировать их по количеству для загрузки. Однако, когда я пытаюсь сопоставить полученный массив, он показывает [object Object], что заставляет меня думать, что что-то преобразует возвращаемый результат в объект, а не в массив.

Функция выглядит следующим образом:

function compressedOrder (original) {
    var compressed = [];
    // make a copy of the input array

  // first loop goes over every element
    for (var i = 0; i < original.length; i++) {

        var myCount = 1;    
        var a = new Object();
        // loop over every element in the copy and see if it's the same
        for (var w = i+1; w < original.length; w++) {
          if (original[w] && original[i]) {
            if (original[i].sku == original[w].sku) {
        // increase amount of times duplicate is found
                myCount++;
                delete original[w];
            }
          }
        }
          if (original[i]) {
                a.sku = original[i].sku;
                a.price = original[i].price;
                a.qtty = myCount;
                compressed.push(a);
          }
    }
    return compressed;
}

И код JS, вызывающий эту функцию:

contents: compressedOrder(item.lineItems).map(indiv => ({
      "id": indiv.sku,
      "price": indiv.price,
      "quantity": indiv.qtty
    }))

Результат:

содержимое: [[Object], [Object], [Object], [Object]]

Когда я JSON .stringify () выводит результат, я вижу, что он извлекает правильную информацию из функции, но я не могу понять, как заставить вызывающую функцию вытаскивать это как массив, который затем может быть отображен, а не как объект.

Правильный вывод, который находится внутри загружаемого фида гораздо большего размера, должен выглядеть следующим образом: содержимое: [{"id": "sku1", "price": 17.50, "amount": 2}, {"id": "sku2", "price": 27.30, "amount": 3}]

{Наверное, это что-то очень простое и очевидное, но сегодня я ломал себе голову над этой (гораздо большей) программой до 4 утра, так что моя голова, наверное, не в том месте}

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Не уверен, какое именно решение вам нужно, но я прочитал ваш вопрос и комментарии. Похоже, вам нужен массив массивов в качестве ответа.

Итак, если я правильно понял ваше требование, и вы могли бы используйте loda sh, тогда вам может помочь следующий фрагмент кода:

const _ = require('lodash');
const resp = [{key1:"value1"}, {key2:"value2"}].map(t => _.pairs(t));
console.log(resp);

PS Предполагается, что ответ compressedOrder выглядит как массив объектов.

0 голосов
/ 08 августа 2020

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

В любом случае спасибо за вашу помощь и вводите всех.

0 голосов
/ 07 августа 2020
contents: compressedOrder(item.lineItems).map(indiv => ({
      "id": indiv.sku,
      "price": indiv.price,
      "quantity": indiv.qtty
    }))

В приведенном выше коде функция compressedOrder возвращает массив объектов, каждый из которых имеет атрибут sku, price и qtty. Далее вы используете карту в этом массиве и снова возвращаете объект с атрибутами id, ценой и количеством.

Чего вы от этого ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...