Javascript对象到数组,长度= 0

Javascript object to array, length = 0

本文关键字:长度 数组 对象 Javascript      更新时间:2023-09-26

我正在构建一个网络商店,用户可以在他们的购物篮中为多个商店中的一个添加产品并结帐(如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);
}

处理数据(其中长度为0)的代码

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

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

cartContent.push(object[i]);

它将自动更新.length属性

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

:

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