2016-07-04 43 views
-3

マイ配列:作成配列からJSONオブジェクト

var categories = [ 
    ["low"], 
    ["medium low", "medium medium", "medium high"], 
    ["high low", "high medium", "high high", "high obscene"] 
]; 

マイオブジェクト:

var values = { 
    abc: { 
    3: ["a", "b", "c"], 
    4: ["m", "n", "o", "p"]. 
    5: ["v", "w", "x", "y", "z"] 
    }, 
    def: { 
    3: ["a1", "b2", "c1"], 
    4: ["m7", "n5", "o8", "p3"]. 
    5: ["v6", "w7", "x4", "y5", "z9"] 
    }, 
    xyz: { 
    3: ["a3", "b4", "c6"], 
    4: ["m6", "n3", "o7", "p1"]. 
    5: ["v3", "w9", "x2", "y7", "z8"] 
    } 
} 

これは私が何をしたいです。

A)categoriesアレイ内の各アレイについて、Iはvaluesオブジェクトかかるように第valuesにおける最初のオブジェクトへcategoriesマッチの配列と それにそれを一致させます。

したがって["low"]は、values.abcの値と一致します。

B)さて、私は)["low"]の場合は、配列内の要素のない、そのちょうど1

Cをチェックする必要がない今、私はvalues.abcの最小数字キーをチェックする(ここでは3)とそれを一致させますオブジェクトを取得する配列{"name":"low","value":"a"}

d)次の配列["medium low", "medium medium", "medium high"]は、values.defの値と一致します。 ここで、配列の長さは3であり、我々は3を取得し、3つのオブジェクトを生成する最小の数字キー.. {"name":"medium low","value":"a1"},{"name":"medium medium","value":"b2"},{"name":"medium high","value":"c1"}

E)同様に、次の配列を有する長さ4にそれを一致するとの数字キー4の値にそれを一致values.xyz、我々は結果がでなければなりません。.. {"name":"high low","value":"m6"},{"name":"high medium","value":"n3"},{"name":"high high","value":"o7"},{"name":"high obscene","value":"p1"}

4つのオブジェクトを生成します..私は非常に少ないを把握することができました

var results = [{ 
    "name": "low", 
    "value": "a" 
}, { 
    "name": "medium low", 
    "value": "a1" 
}, { 
    "name": "medium medium", 
    "value": "b2" 
}, { 
    "name": "medium high", 
    "value": "c1" 
}, { 
    "name": "high low", 
    "value": "m6" 
}, { 
    "name": "high medium", 
    "value": "n3" 
}, { 
    "name": "high high", 
    "value": "o7" 
}, { 
    "name": "high obscene", 
    "value": "p1" 
}] 

var results = categories.forEach(myFunction); 

function myFunction(item, index) { 
    var l = item.length; 
//I need to figure out based on index get the reqd object in values 
// Also based on above var l, get the right array against the numeric key 
} 
+1

@downvoters、この質問にはそんなに悪く何ですか?私は、OPの目標は明確だと思う。 – RomanPerekhrest

+0

@RomanPerekhrest私はちょうどそれを取得しない..有権者に降格provdeポイントを行う、それはdownvoteの理由としてコメントを少なくともdownvote人々を追加する必要がある – Arnab

+0

はい、それです悲しい事実。 * "誰も何もできない..." * – RomanPerekhrest

答えて

1

Object.keysArray.forEachArray.indexOf機能を使用してソリューション:

var categories = [ 
 
    ["low"], 
 
    ["medium low", "medium medium", "medium high"], 
 
    ["high low", "high medium", "high high", "high obscene"] 
 
]; 
 
    
 
var values = { 
 
    abc: { 
 
    3: ["a", "b", "c"], 
 
    4: ["m", "n", "o", "p"], 
 
    5: ["v", "w", "x", "y", "z"] 
 
    }, 
 
    def: { 
 
    3: ["a1", "b2", "c1"], 
 
    4: ["m7", "n5", "o8", "p3"], 
 
    5: ["v6", "w7", "x4", "y5", "z9"] 
 
    }, 
 
    xyz: { 
 
    3: ["a3", "b4", "c6"], 
 
    4: ["m6", "n3", "o7", "p1"], 
 
    5: ["v3", "w9", "x2", "y7", "z8"] 
 
    } 
 
}; 
 

 
var valuesKeys = Object.keys(values), 
 
    result = []; 
 

 
categories.forEach(function (v, k) { 
 
    var size = String(v.length), 
 
     inner_obj = values[valuesKeys[k]], 
 
     inner_keys = Object.keys(inner_obj), 
 
     matches_item = (inner_keys.indexOf(size) !== -1)? inner_obj[size] : inner_obj[Math.min.apply(null, inner_keys)]; 
 
     
 
    v.forEach(function (name, k) { 
 
     result.push({name: name, value: matches_item[k]});  
 
    }); 
 
}) 
 

 
console.log(JSON.stringify(result, 0, 4));

1

あなただけの反復処理と望んでいたパーツを集めることができました。

var categories = [["low"], ["medium low", "medium medium", "medium high"], ["high low", "high medium", "high high", "high obscene"]], 
 
    values = { abc: { 3: ["a", "b", "c"], 4: ["m", "n", "o", "p"], 5: ["v", "w", "x", "y", "z"] }, def: { 3: ["a1", "b2", "c1"], 4: ["m7", "n5", "o8", "p3"], 5: ["v6", "w7", "x4", "y5", "z9"] }, xyz: { 3: ["a3", "b4", "c6"], 4: ["m6", "n3", "o7", "p1"], 5: ["v3", "w9", "x2", "y7", "z8"] } }, 
 
    order = Object.keys(values).sort(), 
 
    result = categories.reduce(function (r, a, i) { 
 
     var keys = Object.keys(values[order[i]]).sort(function (a, b) { return a - b; }); 
 
     return r.concat(a.map(function (b, j) { 
 
      return { 
 
       name: b, 
 
       value: (values[order[i]][a.length] || values[order[i]][keys[0]])[j] 
 
      }; 
 
     })); 
 
    }, []); 
 

 
console.log(result);

関連する問題