12

我在 JavaScript 中有一个构造函数,其中包含 2 个属性KeyValues 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 。因此,您应该重新考虑在您的情况下使用 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

您可以使用.reduce(),.concat().map()为此。

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

不知道values.map(values);应该做什么。

演示:http: //jsfiddle.net/BWNGr/

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

如果您对不创建不必要的数组非常严格,您可以稍微调整一下并使用.push()而不是.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;
}, []);

演示:http: //jsfiddle.net/BWNGr/1/

于 2012-10-25T21:20:06.607 回答
0

您可以通过对每个键值对将被推送到数组的每个循环使用以下内容来实现此目的。

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 回答