12

Key私は2つのプロパティと を含むJavaScriptのコンストラクタを持っていますValues array:

function Test(key, values) {
    this.Key = key;
    this.Values = values.map(values);
}

次に、次の配列を作成しましたTest objects

 var testObjectArray = [];
 testObjectArray.push(new Test(1, ['a1','b1']), new Test(2, ['a1','b2']));

testObjectArray次に、次のような単一のkey-valueペア配列にマップします。

[
    { "Key" : "1", "Value" : "a1" },
    { "Key" : "1", "Value" : "b1" },
    { "Key" : "2", "Value" : "a2" },
    { "Key" : "2", "Value" : "b2" },
]

map配列の関数を使用してこれを達成するにはどうすればよいですか?

4

4 に答える 4

16

あなたはmap()を誤解していると思います。非常に簡単な例を次に示します。

a = [1, 2, 3]
b = a.map(function (i) { return i + 1 })
// => [2, 3, 4]

マップのMDNドキュメントは次のとおりです:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map 。したがって、あなたの場合、マップの使用法を再考する必要があります。ちなみに、値は関数ではないため、例は機能していません。

考えられる解決策は次のとおりです。

res = [];
a = [['a1','b1'],['a1','b2']];

for (var i = 0; i < a.length; ++i) {
  for(var j = 0; j < a[i].length; ++j) {
    res.push({"Key": i + 1 , "Value" : a[i][j]});
  }
}
于 2012-10-25T21:39:16.007 に答える
1

他の方法があると確信していますが、ここにあなたが望むことをするプレーンなJavascriptを使ったものがあります:

http://jsfiddle.net/KXBRw/

function Test(key, values) {
    this.Key = key;
    this.Values = values;//values.map(values);
}

function getCombinedTests(testObjectArray) {
    var all = [];
    for (var i = 0; i < testObjectArray.length; i++) {
        var cur = testObjectArray[i];
        for (var j = 0; j < cur.Values.length; j++) {
            all.push({"Key": ""+cur.Key, "Value": cur.Values[j]});
        }
    }
    return all;
}

var testObjectArray1 = [];
testObjectArray1.push(new Test(1, ['a1','b1']), new Test(2, ['a1','b2']));

var combined = getCombinedTests(testObjectArray1);

console.log(combined);
于 2012-10-25T21:21:44.553 に答える
0

You could use .reduce(), .concat() and .map() for this.

var result = testObjectArray.reduce(function(res, obj) {
    return res.concat(obj.Values.map(function(val) {
        return {"Key":obj.Key, "Value":val};
    }));
}, []);

Not sure what values.map(values); was supposed to do though.

DEMO: http://jsfiddle.net/BWNGr/

[
    {
        "Key": 1,
        "Value": "a1"
    },
    {
        "Key": 1,
        "Value": "b1"
    },
    {
        "Key": 2,
        "Value": "a1"
    },
    {
        "Key": 2,
        "Value": "b2"
    }
]

If you're super strict about not creating unnecessary Arrays, you can tweak it a little and use .push() instead of .concat().

var result = testObjectArray.reduce(function(res, obj) {
    res.push.apply(res, obj.Values.map(function(val) {
        return {"Key":obj.Key, "Value":val};
    }));
    return res;
}, []);

DEMO: http://jsfiddle.net/BWNGr/1/

于 2012-10-25T21:20:06.607 に答える
0

これを実現するには、次の for each ループを使用して、各キーと値のペアを配列にプッシュします。

var mapped = [];
$.each(testObjectArray, function(key, value) { 
  for(x in value.Values) {
    mapped.push({
      Key: value.Key,
      Value: x
    });
  }
});
于 2012-10-25T21:25:51.923 に答える