Javascript对象到数组,长度= 0
Javascript object to array, length = 0
我正在构建一个网络商店,用户可以在他们的购物篮中为多个商店中的一个添加产品并结帐(如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引擎,你可以:
使用
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]];
}
}
相关文章:
- 根据PHP中数组的长度在Google Maps API中循环遍历标记
- 数组长度 内部功能不同
- javascript数组的长度,其中项是对象
- Vue.js:手表数组长度
- 尝试从计算创建数组时数组长度无效
- 获取数组的长度-打印不正确的值
- 在可变长度d3的多维数组上迭代
- 从数组[Javascript]的总长度中减去一个干净的数字
- 断言错误:断言失败:坐标数组的长度应与步幅匹配
- 如何使用数组减少来求和对象属性长度,不带类型
- 哪一个在访问数组长度方面的性能更好
- 为什么删除运算符不更改数组的长度
- 无法获取数组的长度
- 数组中每个文件的javascript长度
- 在Javascript中查找数组长度
- 为什么我的数组长度没有增加
- $.when.apply 根据输入数组的长度返回具有不同结构的结果
- 长度属性未在对象数组上更新
- javascript数组长度提供了不正确的值
- 在javascript中按字符串长度筛选数组