2016-11-15 2 views
-1

Я создаю интернет-магазин, где пользователи могут добавлять продукты для одного из других магазинов в своей корзине и выписке (например, AliExpress).Объект Javascript для массива, длина = 0

На странице обзора корзины содержимое корзины показано сортировкой по магазину. Если один и тот же продукт добавляется несколько раз в разные магазины, продукт отображается каждым магазином.

Теперь я хочу создать заказ для каждого магазина с продуктами, заказанными в этом магазине. Я использую Angular для создания списка с продуктами, заказанными/отфильтрованными в магазине. Эти данные будут отправлены на мой сервер Node.JS, чтобы закодировать содержимое и создать несколько заказов с элементами.
Проблема, я думаю, в том, что данные обрабатываются как «объект», а не «массив». Я нашел функцию, которая преобразует объект в массив, но длина по-прежнему равна «0».

Как обрабатывать данные, чтобы я мог перебирать разные элементы?

AngularJS код для сортировки телегу магазина

$scope.filterProducts = function(groupName) { 
    $scope.productList = []; 
    $http({ 
     method: 'GET', 
     xhrFields: {withCredentials: true}, 
     url: '/loadCart' 
    }).then(function successCallback(response){ 
     if (response.data) { 
      var mapByShop = function(arr, groupName) { 
       return arr.reduce(function(result, item) { 
        result[item[groupName]] = result[item[groupName]] || {}; 
        result[item[groupName]][item['productId']] = item; 
        console.log('GROUPNAME en RESULT', groupName, result); 
        return result; 
       }, {}); 
      }; 
      if (response.data.length > 0) { 
       if (groupName == 'shopName') { 
        $scope.productList = mapByShop(response.data, groupName); 
       } else { 
        $scope.checkoutList = mapByShop(response.data, groupName); 
       } 
      } 
     } 
    }, function errorCallback(response){ 
     console.log(response); 
    }); 
    } 

The $scope.productList посылается как 'данные' в $http POST функции.

Node.js код для преобразования объекта в массив

function convertObjectToArray(object, cb){ 
    var cartContent = []; 
    for (var i in object) { 
     cartContent[i] = object[i]; 
    } 
    console.log("convertObjectToArray"); 

    return cb(cartContent); 
} 

код для обработки данных (где длина равна нулю)

convertObjectToArray(req.body.cart, function(result){ 
    console.log(isArray(result)); 
    console.log('result', result); 
    console.log("lenght", result.length); 
}) 

FYI: функция isArray

function isArray(myArray) { 
    return myArray.constructor.toString().indexOf("Array") > -1; 
} 
+0

FYI (это может быть или может не иметь ничего общего с этой проблемой), это очень плохой 'функция isArray'. Если вы используете его на стороне сервера, обновите его до последней версии NodeJS и вместо этого используйте 'Array.isArray'. Если нет, или вы не можете обновить по какой-либо причине, код для вашей прокладки должен быть возвращен Object.prototype.toString.call (myArray) === "[object Array]"; ' –

+1

вы можете использовать' угловой. isArray', чтобы проверить, является ли это массивом – Icycool

+2

Вы можете использовать 'Array.isArray' для функции' isArray' – Rajesh

ответ

2

Если массив не имеет значения, вы должны использовать

cartContent.push(object[i]); 

Это обновит .length свойство автоматически

+0

Никакой заказ не важен потому что детали сортированы магазином. Очень простое, бриллиантное решение. Я пытаюсь использовать его! – NVO

0

Ваша проблема заключается в том, что вы добавляете свойства массива объектов, а не с помощью массива API для вставки в целых точках объекта. Это означает, что массив по существу остается «пустым». Если вы вставляете целое число при вставке в массив, ваш код будет работать лучше.

Разбитые бит:

for (var i in object) { 
    cartContent[i] = object[i]; 
} 

i является строка ключа здесь и не будет увеличивать длину массива, если значение не принуждает до целого значения (я думаю).

Нечто подобное может работать:

// Untested... 
var keys = Object.keys(object); 
for (var i = 0; i < keys.length; i++) { 
    cartContent[i] = object[keys[i]]; 
} 

Или как другой ответ предложил, использовать push API.

Помимо:

Если вы в современный движок JS вы можете:

  1. Использование Object.values или

  2. Написать пару полезных функций и преобразовать объект в массив используя следующее:

:

var o = iterable({foo:'fooValue', bar: 'barValue'}); 
console.log([...o]); 

Утилита функции:

function iterable(o) { 
    if(o[Symbol.iterator]) { 
     return o; 
    } 

    o[Symbol.iterator] = iter.bind(null, o); 
    return o; 
} 

function* iter(o) { 
    var keys = Object.keys(o); 
    for (var i=0; i<keys.length; i++) { 
     yield o[keys[i]]; 
    } 
} 
Смежные вопросы