2017-09-09 3 views
0

Initial Code lesen:JS. Kann nicht Eigentum von undefined

var bestproducts = {} 

data.forEach(function(element,index) { 
    bestproducts[element.shop_id][index] = element.product_data 
} 

Während der ersten Iteration ich die folgende Fehlermeldung erhalten:

Uncaught TypeError: Cannot set property '0' of undefined

Die einzige Lösung, die ich über gekommen sind ist die folgende:

var bestproducts = [] 

data.forEach(function(element,index) { 
    if(!bestproducts[element.shop_id]){ 
    bestproducts[element.shop_id] = {} 
    bestproducts[element.shop_id][index] = element.product_data 
    } else { 
    bestproducts[element.shop_id][index] = element.product_data 
    } 
} 

FRAGE: Gibt es in diesem Fall eine kürzere/elegantere Lösung?

+1

die gleiche Linie löschte des 'if' und entferne den' else' Block. – Lux

Antwort

0

Kurze Antwort, nein. Sie müssen ein Objekt definieren, bevor Sie es zuweisen.

Eine elegantere Art und Weise zuweisen, etwas zu tun sein würde:

var bestproducts = [] 

data.forEach(function(element,index) { 
    bestproducts[element.shop_id] = bestproducts[element.shop_id] || {}; 
    bestproducts[element.shop_id][index] = element.product_data; 
} 

bestproducts[element.shop_id] || {} zum ersten Mal bestproducts[element.shop_id] ist nicht definiert daher der erste Wert, den Sie leeres Objekt zuweisen. Für den Rest der Iteration bestproducts[element.shop_id] ist nicht undefiniert, so wird es bestproducts[element.shop_id] zu sich selbst zuweisen.

+0

Sie können das Objekt, das 'bestproducts [element.shop_id]' zugewiesen ist, direkt initialisieren. Siehe meine Antwort. –

0

Sie könnten so etwas machen, indem Sie bestproducts[element.shop_id] direkt mit einem Objekt mit eigenen Eigenschaften initialisieren.

var data = [{shop_id: "a1", product_data: "a1_prod"}, {shop_id: "a2", product_data: "a2_prod"}]; 
 
var result = ""; 
 

 
var bestproducts = {}; 
 

 
data.forEach(function(element,index) { 
 
    bestproducts[element.shop_id] = { [index]: element.product_data }; 
 
    result += bestproducts[element.shop_id][index] + " "; 
 
}); 
 

 
document.getElementById("result").innerHTML = result;
<div id="result"></div>

Ofcourse, die alle das Ergebnis Zeug ist nur für die Visualisierung und entsorgt werden können.

0

Mit dem Ziel Ausbreitung Betreiber dies eine sauberere Lösung in Betracht gezogen werden könnte:

var bestproducts = [] 

data.forEach(function(element,index) { 
    bestproducts[element.shop_id] = { 
    ...bestproducts[element.shop_id], 
    [index]: element.product_data, 
    } 
} 

aber ich denke, eine sauberere Version des Original-Code ist der beste Ansatz:

var bestproducts = [] 

data.forEach(function(element,index) { 
    if(!bestproducts[element.shop_id]){ 
    bestproducts[element.shop_id] = {} 
    } 
    bestproducts[element.shop_id][index] = element.product_data 
} 
Verwandte Themen