2016-08-17 10 views
-1

のプロパティ「CONCAT」を読み取ることができません、私ははそもそも未定義

国単位 ---->顧客レポートグループ ---->顧客

のように実体のマルチレベルを持っています 顧客レポーティンググループ以降のそれぞれが異なる 顧客を持っているが異なってい

国単位

コード内

変数名は、これはmenuDataと呼ばれるマルチレベルオブジェクトで表現されて

立方----> CRG --->お客様のとおりです。私が望んで

menuData = { 
    cu1: { 
     CRG3: { 
      Customer1: {}, 
      Customer5: {} 
     }, 
     CRG7: { 
      Customer3: {}, 
      Customer2: {}, 
      Customer7: {} 
     } 
    }, 
    cu4: { 
     CRG1: { 
      Customer2: {}, 
      Customer4: {} 
     }, 
     CRG3: { 
      Customer4: {} 
     } 
    } 
}; 

マルチレベルオブジェクトの各レベルの一意のIDを構築することです。たとえば、顧客単位のIDは同じ

cu1となります。 CU2ので、IDSは、Cu + CU1顧客のための+ crg4

のようにCRGで構成されます顧客のレポート・グループの

上:

CU1 + crg4 + customer6。私が何をしたか

がgetIds

と呼ばれる関数である
var getIds = function(menuData) { 
    var ids = {}; 
    for (cu in menuData) { 
     ids[cu] = cu; 
     for (crg in menuData[cu]) { 
      if (!(ids[cu] in ids)) { 
       ids[cu] = {}; 
       ids[cu][crg] = ids[cu].concat(crg); 
      } else ids[cu][crg] = ids[cu].concat(crg); 
      for (customer in menuData[cu][crg]) { 
       if (!ids[cu][crg]) { 
        ids[cu][crg] = {}; 
        ids[cu][crg][customer] = ids[cu][crg].concat(customer); 
       } else ids[cu][crg][customer] = ids[cu][crg].concat(customer); 
      } 
     } 
    } 
    console.log(ids); 
    return ids; 
}; 

私が得たエラーがある

私がいることで試してみました何未定義

のプロパティ 'CONCAT' を読み取ることができませんそれは定義されていないと言われているので、まだ定義されていないと定義しようとします。

if (!(ids[cu] in ids)) { 
    ids[cu] = {}; 
    ids[cu][crg] = ids[cu].concat(crg); 
} 

値が定義されていなければ値を挿入しますが、定義されている場合は値 を割り当ててください。ids [cu] [crg] = ids [cu] .concat(crg);

なぜこのエラーが発生しますか?マルチレベルオブジェクトのIDを取得する方法は?


編集は、excpected出力は

ids = { 
    "cu1": { 
     "cu1+CRG3": { "cu1+CRG3+Customer1":{}, "cu1+CRG3+Customer5":{} }, 
     "cu1+CRG7": { "cu1+CRG7+Customer3":{}, "cu1+CRG7+Customer2":{}, "cu1+CRG7+Customer7":{} } 
    }, 
    "cu4": { 
     "cu4+CRG1": { "cu4+CRG1+Customer2":{}, "cu4+CRG1+Customer4":{} }, 
     "cu4+CRG3": { "cu4+CRG3+Customer4":{}} 
    } 
} 
+3

'.concat'は' Object' [Array.prototype.concat]ではなく 'Array'のメソッドです(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array)。/concat)をMDNに追加します。 –

+0

期待される出力は何ですか? – brk

答えて

1

コードの問題は、オブジェクトを使用してデータを格納していることであり、オブジェクトにはメソッド「連結」のみがありません。配列には「連結」メソッドがあります。あなたのオブジェクトは、仕事にこれらのようになります。

menuData = [ 
    "cu1": [ 
     "CRG3": [ "Customer1":{}, "Customer5":{} ], 
     "CRG7": [ "Customer3":{}, "Customer2":{}, "Customer7":{} ] 
    ], 
    "cu4": [ 
     "CRG1": [ "Customer2":{}, "Customer4":{} ], 
     "CRG3": [ "Customer4":{}] 
    ] 
] 

Here's参照:MDN Array.concat()

JSに混乱することができますどのようなオブジェクトのプロパティは、配列のようにアクセスすることができるということです。予想される出力が追加された後

アップデート:私はCONCATは、あなたの問題のために適切なソリューションではありません考えるより

大丈夫。

このようなもので、それを試してみてください:配列を伝承再帰関数のための

function getIds(dataIn, idsIn) { 
    idsIn = idsIn || []; 
    var dataOut = {}, idOut; 
    for (var idIn in dataIn) { 
    idsOut = idsIn.concat([idIn]); 
    dataOut[idsOut.join('+')] = getIds(dataIn[idIn], idsOut); 
    } 
    return dataOut; 
} 

パーフェクトユースケース:私はこのようにそれを試してみた

var ids = {}; 
 

 
var menuData = { 
 
    cu1: { 
 
     CRG3: { 
 
      Customer1: {}, 
 
      Customer5: {} 
 
     }, 
 
     CRG7: { 
 
      Customer3: {}, 
 
      Customer2: {}, 
 
      Customer7: {} 
 
     } 
 
    }, 
 
    cu4: { 
 
     CRG1: { 
 
      Customer2: {}, 
 
      Customer4: {} 
 
     }, 
 
     CRG3: { 
 
      Customer4: {} 
 
     } 
 
    } 
 
}; 
 

 
for (propKeyLevel1 in menuData){ 
 
    ids[propKeyLevel1] = {}; 
 
    var propLevel1 = ids[propKeyLevel1]; 
 
    for(propKeyLevel2 in menuData[propKeyLevel1]){ 
 
    propLevel1[propKeyLevel1+"+"+propKeyLevel2] = {}; 
 
    var propLevel2 = propLevel1[propKeyLevel1+"+"+propKeyLevel2]; 
 
    
 
    for(propKeyLevel3 in menuData[propKeyLevel1][propKeyLevel2]){ 
 
     propLevel2[propKeyLevel1+"+"+propKeyLevel2+"+"+propKeyLevel3] = {}; 
 
    } 
 
    } 
 
    
 
} 
 

 
console.log(ids);

+0

私はちょうどこの会社に新しいがあり、データは記述されているようにオブジェクトフォーマットで保存されました。今何をしようとしているのは、マルチレベルオブジェクトmenuDataからユニークなIDを取得することです –

0

連結は、文字列または配列のために、ここにあなたがそれ故にオブジェクトエラー時にそれを呼び出すための方法です。あなたが何をしようとして

は私には少しは不明ですが、多分あなたはそれを試みることができる:

ids[cu][crg] = crg; 

の代わり:

ids[cu][crg] = ids[cu].concat (crg); 

それはあなたがしようとしているように見えるものですので。

0

idsOut)を使用して目的のオブジェクトキーを生成します。かなりストレートです。

関連する問題