Javascript对象为数组,长度= 0

时间:2016-11-15 09:29:20

标签: javascript angularjs arrays node.js object

我正在建立一个网上商店,用户可以在其购物篮和结账时为其中一个商店添加产品(如AliExpress)。

在购物车概览页面上,购物篮的内容按商店排序显示。如果在不同的商店中多次添加相同的产品,则每个商店都会显示该产品。

现在,我想为每个商店创建一个订单,其中包含该商店订购的商品。我正在使用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);
    });
  }

$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);
})

仅供参考:isArray功能

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

2 个答案:

答案 0 :(得分:2)

如果数组顺序不重要,则应使用

cartContent.push(object[i]);

它会自动更新.length属性

答案 1 :(得分:0)

您的问题是您正在向数组对象添加属性,而不是使用Array 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. 使用以下内容编写几个实用程序函数并将对象转换为数组

  3. 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]];
        }
    }