web-dev-qa-db-ja.com

配列をオブジェクトの配列に変換します

配列をJavaScriptオブジェクトの配列に変換する方法。

たとえば、私は次のような配列を持っています

data = [
    ["fruits","frozen","fresh","rotten"],
    ["apples",884,494,494],
    ["oranges",4848,494,4949],
    ["kiwi",848,33,33]
]

名前と値のペアに変換したい。

たとえば、結果のコレクションの最初のオブジェクトは次のようになります。

 {"fruits": "Apple", "frozen": 884, "fresh": 494, "rotten": 494}

残りのデータについても同様です。

9
user3084017

[〜#〜]デモ[〜#〜]

提供されたデータの使用:

var data = [
    ["fruits","frozen","fresh","rotten"],
    ["apples",884,494,494],
    ["oranges",4848,494,4949],
    ["kiwi",848,33,33]
]

次の関数は、配列の最初の要素をオブジェクトプロパティのキーとして扱います。次に、残りの要素をループし、これらのキーを使用してそれらをオブジェクトに変換します。最後に、これらの新しいオブジェクトの配列を返します。

function convertToArrayOfObjects(data) {
    var keys = data.shift(),
        i = 0, k = 0,
        obj = null,
        output = [];

    for (i = 0; i < data.length; i++) {
        obj = {};

        for (k = 0; k < keys.length; k++) {
            obj[keys[k]] = data[i][k];
        }

        output.Push(obj);
    }

    return output;
}

出力

[
    { fruits: 'apples', fresh: 494, frozen: 884, rotten: 494 },
    { fruits: 'oranges', fresh: 494, frozen: 4848, rotten: 4949 },
    { fruits: 'kiwi', fresh: 33, frozen: 848, rotten: 33 }
]
8
crush

Mapとreduceの両方を使用すると、ソリューションは非常にエレガントになります。

var collection = [
    ["fruits","frozen","fresh","rotten"],
    ["apples",884,494,494],
    ["oranges",4848,494,4949],
    ["kiwi",848,33,33]
];

var keys = collection.shift();
collection = collection.map(function (row) {
    return keys.reduce(function (obj, key, i) {
      obj[key] = row[i];
      return obj;
    }, {});
});

出力:

[ 
  { fruits: 'apples', frozen: 884, fresh: 494, rotten: 494 },
  { fruits: 'oranges', frozen: 4848, fresh: 494, rotten: 4949 },
  { fruits: 'kiwi', frozen: 848, fresh: 33, rotten: 33 } 
]
7

shift() + map() + forEach()を使用すると、2回の反復を回避できます。

var data = [
    ["fruits","frozen","fresh","rotten"],
    ["apples",884,494,494],
    ["oranges",4848,494,4949],
    ["kiwi",848,33,33]
];

var collection = data.slice(); // make a copy
var keys = collection.shift();

collection = collection.map(function (e) {
    var obj = {};

    keys.forEach(function (key, i) {
        obj[key] = e[i];
    });

    return obj;
});

デモ: http://jsfiddle.net/d7W76/2/

6
Pavlo