2016-11-15 84 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); 
    }); 
    } 

$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

FYI(這可能會或可能不會有什麼的問題),這是一個非常貧窮的'isArray'功能。如果您在服務器端使用它,請更新到任何最新版本的NodeJS,並使用'Array.isArray'代替。如果沒有,或者你因爲某些原因升級,爲您墊片的代碼應該是'返回Object.prototype.toString.call(myarray的)===「[對象數組]」;' –

+1

您可以用'角。 isArray'來檢查它是否是一個數組 – Icycool

+2

你可以用'Array.isArray'爲'isArray'功能 – Rajesh

回答

2

如果陣列順序不重要,則應使用

cartContent.push(object[i]); 

它將更新.length財產全自動

+0

沒有訂單並不重要,因爲商品是按商店排序的。非常簡單,briljant解決方案。我要去嘗試使用它! – NVO

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. 寫了幾個實用功能和對象轉換成數組使用以下

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