我正在建立一个网上商店,用户可以在其购物篮和结账时为其中一个商店添加产品(如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;
}
答案 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引擎,则可以:
使用Object.values
或
使用以下内容编写几个实用程序函数并将对象转换为数组
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]];
}
}