変換する最良の方法は何ですか:
['a','b','c']
に:
{
0: 'a',
1: 'b',
2: 'c'
}
_.toPlainObject
です。例:var myObj = _.toPlainObject(myArr)
変換する最良の方法は何ですか:
['a','b','c']
に:
{
0: 'a',
1: 'b',
2: 'c'
}
_.toPlainObject
です。例:var myObj = _.toPlainObject(myArr)
回答:
ECMAScript 6は簡単にポリフィル可能なものを導入しますObject.assign
:
この
Object.assign()
メソッドは、列挙可能なすべての独自のプロパティの値を1つ以上のソースオブジェクトからターゲットオブジェクトにコピーするために使用されます。ターゲットオブジェクトを返します。
Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}
length
配列の独自のプロパティは列挙できないため、コピーされません。
また、ES6 スプレッド構文を使用して同じ結果を得ることができます。
{ ...['a', 'b', 'c'] }
{ ...[sortedArray]}
このような関数を使って:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
rv[i] = arr[i];
return rv;
}
配列はすでにほぼオブジェクトにすぎませんが、配列には整数名付きプロパティに関して「興味深い」特別な動作があります。上記は単純なオブジェクトを提供します。
編集はああも、あなたは、アレイ内の「穴」のアカウントが必要になる場合があります
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
if (arr[i] !== undefined) rv[i] = arr[i];
return rv;
}
最新のJavaScriptランタイムでは、次の.reduce()
メソッドを使用できます。
var obj = arr.reduce(function(acc, cur, i) {
acc[i] = cur;
return acc;
}, {});
これは、配列内の「穴」も回避するためです.reduce()
。
[]
数値プロパティキーと「length」プロパティを使用しない場合は、Arrayインスタンス()を作成しても意味がありません。
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
アキュムレータakaを使用できますreduce
。
['a','b','c'].reduce(function(result, item, index, array) {
result[index] = item; //a, b, c
return result;
}, {}) //watch out the empty {}, which is passed as "result"
空のオブジェクト{}
を開始点として渡します。次に、そのオブジェクトを段階的に「拡張」します。反復の終わりには、result
なります{"0": "a", "1": "b", "2": "c"}
配列がキーと値のペアのオブジェクトのセットである場合:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
var key = Object.keys(item)[0]; //first property: a, b, c
result[key] = item[key];
return result;
}, {});
生成されます: {a: 1, b: 2, c: 3}
完全をreduceRight
期すために、配列を逆の順序で反復できるようにします。
[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)
生成されます: {c:3, b:2, a:1}
アキュムレータは、特定の目的のために任意のタイプにすることができます。たとえば、配列内のオブジェクトのキーと値を交換するには、次を渡し[]
ます:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
var key = Object.keys(item)[0]; //first property: a, b, c
var value = item[key];
var obj = {};
obj[value] = key;
result.push(obj);
return result;
}, []); //an empty array
生成されます: [{1: "a"}, {2: "b"}, {3: "c"}]
とは異なりmap
、reduce
1-1マッピングとして使用することはできません。含めるまたは除外するアイテムを完全に制御できます。したがってreduce
、あなたは何をするかを達成することfilter
ができ、それはreduce
非常に用途が広いです:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
if(index !== 0) { //skip the first item
result.push(item);
}
return result;
}, []); //an empty array
生成されます: [{2: "b"}, {3: "c"}]
注意:reduce
およびのObject.key
一部ですECMA 5th edition
。それらをサポートしないブラウザー(特にIE8)にはポリフィルを提供する必要があります。
Mozillaによるデフォルトの実装をご覧ください。
jqueryを使用している場合:
$.extend({}, ['a', 'b', 'c']);
{0: 'a', 1: 'b', 2: 'c'}
、期待される結果です。
完全を期すために、ECMAScript 2015(ES6)の普及。transpiler(Babel)または少なくともES6を実行している環境が必要です。
console.log(
{ ...['a', 'b', 'c'] }
)
私はおそらくそれをこのように書くでしょう(非常にまれに、私はunderscorejsライブラリを手元に置いていないからです):
var _ = require('underscore');
var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }
obj=_.extend({},a);
。また、配列を反復処理する場合_.each
は、より適切だと思います_.map
。全体として、これはいくつかのレベルで良い答えではありません。
以下は、完全を期すためのO(1)ES2015メソッドです。
var arr = [1, 2, 3, 4, 5]; // array, already an object
Object.setPrototypeOf(arr, Object.prototype); // now no longer an array, still an object
length
プロパティを削除しません。(3)オブジェクトはまだ配列ですArray.isArray(arr) === true
。(4)arr.length = 0
すべてのインデックスを削除するなど、特別な配列動作は削除されません。(5)したがって、私Object.assign
ははるかに優れていると思います。
Array.isArray
返さないのに...true
instanceof Array
見ていないことに驚いた-
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "first":"a", "second":"b","third":"c" }
修正されたキーを使用して作成するスマートな提案-私は破壊を探しています
我々は使用することができますObject.assign
し、array.reduce
オブジェクトの配列を変換する機能。
var arr = [{a:{b:1}},{c:{d:2}}]
var newObj = arr.reduce((a, b) => Object.assign(a, b), {})
console.log(newObj)
ECMAScript 2015(ES6)標準の一部であるため、オブジェクトスプレッドオペレーターを使用しました。
const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}
例として次のフィドルを作成しました。
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}
最近のJavaScriptでの簡単な方法はObject.assign()
、あるオブジェクトから別のオブジェクトにkey:valueをコピーする以外に何もしないことです。この例でArray
は、プロパティをnew に寄付します{}
。
O.assign
でしたが、説明が不足していました。現在、配列をオブジェクトに{...array}
ES2016の場合、オブジェクトの演算子を展開します。注:これはES6の後であるため、トランスパイラーを調整する必要があります。
const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"}
5年後、良い方法があります:)
Object.assign
ECMAScript 2015で導入されました。
Object.assign({}, ['a', 'b', 'c'])
// {'0':'a', '1':'b', '2':'c'}
これ javascript#forEach
を行うことができます
var result = {},
attributes = ['a', 'b','c'];
attributes.forEach(function(prop,index) {
result[index] = prop;
});
ECMA6の場合:
attributes.forEach((prop,index)=>result[index] = prop);
FWIWは、お互いの最近のアプローチは、新しいを使用することであるObject.fromEntries
とともにObject.entries
、次のように:
const arr = ['a','b','c'];
arr[-2] = 'd';
arr.hello = 'e';
arr.length = 17;
const obj = Object.fromEntries(Object.entries(arr));
...まばらな配列項目をundefined
またはとして保存することを避けることができますnull
、非インデックス(例:非正整数/非数値)キーを保持します。
arr.length
ただし、は含まれていないため、を追加することもできます。
obj.length = arr.length;
ES6を使用している場合は、Object.assignとspread演算子を使用できます
{ ...['a', 'b', 'c'] }
あなたがのような配列を入れ子にしている場合
var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))
new Map([['key1', 'value1'], ['key2', 'value2']]);
素早く汚いもの:
var obj = {},
arr = ['a','b','c'],
l = arr.length;
while( l && (obj[--l] = arr.pop() ) ){};
{0:"c", 1:"b", 2:"a"}
。あなたは、どちらかの希望unshift
の代わりに、pop
または(より良い)で始まりi=arr.length-1
、代わりにデクリメント。
l = arr.length
(そして、while (l && (obj[--l] = arr.pop())){}
これは古いことに気づきますが、さらに単純化しないでください)。
速くて汚い#2:
var i = 0
, s = {}
, a = ['A', 'B', 'C'];
while( a[i] ) { s[i] = a[i++] };
i < a.length
代わりにチェックする必要がありa[i]
ます。
Lodash 3.0.0のとおり、あなたは使用することができます_.toPlainObjectを
var obj = _.toPlainObject(['a', 'b', 'c']);
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
これが私が書いたばかりの再帰関数です。シンプルでうまく機能します。
// Convert array to object
var convArrToObj = function(array){
var thisEleObj = new Object();
if(typeof array == "object"){
for(var i in array){
var thisEle = convArrToObj(array[i]);
thisEleObj[i] = thisEle;
}
}else {
thisEleObj = array;
}
return thisEleObj;
}
次に例を示します(jsFiddle):
var array = new Array();
array.a = 123;
array.b = 234;
array.c = 345;
var array2 = new Array();
array2.a = 321;
array2.b = 432;
array2.c = 543;
var array3 = new Array();
array3.a = 132;
array3.b = 243;
array3.c = 354;
var array4 = new Array();
array4.a = 312;
array4.b = 423;
array4.c = 534;
var array5 = new Array();
array5.a = 112;
array5.b = 223;
array5.c = 334;
array.d = array2;
array4.d = array5;
array3.d = array4;
array.e = array3;
console.log(array);
// Convert array to object
var convArrToObj = function(array){
var thisEleObj = new Object();
if(typeof array == "object"){
for(var i in array){
var thisEle = convArrToObj(array[i]);
thisEleObj[i] = thisEle;
}
}else {
thisEleObj = array;
}
return thisEleObj;
}
console.log(convArrToObj(array));
結果:
['a' = '1', 'b' = '2', 'c' = '3']
、{a: 1, b: 2, c: 3}
このようにそれが完璧に機能することを望むならば、これはより高いはずです。
.reduce((o,v,i)=>(o[i]=v,o), {})
[ドキュメント]
以上の冗長
var trAr2Obj = function (arr) {return arr.reduce((o,v,i)=>(o[i]=v,o), {});}
または
var transposeAr2Obj = arr=>arr.reduce((o,v,i)=>(o[i]=v,o), {})
バニラJSで最短のもの
JSON.stringify([["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[i]=v,o}, {}))
=> "{"0":["a","X"],"1":["b","Y"]}"
より複雑な例
[["a", "X"], ["b", "Y"]].reduce((o,v,i)=>{return o[v[0]]=v.slice(1)[0],o}, {})
=> Object {a: "X", b: "Y"}
さらに短い(function(e) {console.log(e); return e;}
=== を使用(e)=>(console.log(e),e)
)
nodejs
> [[1, 2, 3], [3,4,5]].reduce((o,v,i)=>(o[v[0]]=v.slice(1),o), {})
{ '1': [ 2, 3 ], '3': [ 4, 5 ] }
[/ドキュメント]
[/docs]
か?コードスニペットを実行可能にする方が便利です。
これは単にで行いArray.of()
ます。配列には、そのコンテキストをコンストラクターとして使用する機能があります。
注2 of関数は、意図的に汎用的なファクトリメソッドです。この値がArrayコンストラクタである必要はありません。したがって、単一の数値引数で呼び出すことができる他のコンストラクターに転送または継承できます。
したがってArray.of()
、関数にバインドして、オブジェクトのような配列を生成できます。
function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);
利用するArray.of()
ことで、配列のサブクラス化を行うことさえできます。
Map
またはを使用できる場合Object.assign
、それは非常に簡単です。
配列を作成します。
const languages = ['css', 'javascript', 'php', 'html'];
以下は、インデックスをキーとして持つオブジェクトを作成します:
Object.assign({}, languages)
上記と同じをマップで複製
インデックスベースのオブジェクト{0 : 'css'}
などに変換します。
const indexMap = new Map(languages.map((name, i) => [i, name] ));
indexMap.get(1) // javascript
値ベースのオブジェクト{css : 'css is great'}
などに変換します...
const valueMap = new Map(languages.map(name => [name, `${name} is great!`] ));
valueMap.get('css') // css is great
アイテムの配列をオブジェクトにすばやく変換するシンプルで生意気な方法
function arrayToObject( srcArray ){
return JSON.parse( JSON.stringify( srcArray ) );
}
次に、それをそのように使用します...
var p = [0,2,3,'pork','pie',6];
obj = new arrayToObject( p );
console.log( obj[3], obj[4] )
// expecting `pork pie`
出力:
pork pie
タイプの確認:
typeof obj
"object"
そして、プロトタイプメソッドがなければ、物事は完全ではありません。
Array.prototype.toObject =function(){
return JSON.parse( JSON.stringify( this ) );
}
ライクの使用:
var q = [0,2,3,'cheese','whizz',6];
obj = q.toObject();
console.log( obj[3], obj[4] )
// expecting `cheese whizz`
出力:
cheese whizz
*名前付けルーチンがないことに注意してください。したがって、特定の名前を付けたい場合は、以下の既存のメソッドを引き続き使用する必要があります。
古い方法
これにより、定義したキーを必要な順序で使用して、配列からオブジェクトを生成できます。
Array.prototype.toObject = function(keys){
var obj = {};
var tmp = this; // we want the original array intact.
if(keys.length == this.length){
var c = this.length-1;
while( c>=0 ){
obj[ keys[ c ] ] = tmp[c];
c--;
}
}
return obj;
};
result = ["cheese","paint",14,8].toObject([0,"onion",4,99]);
console.log(">>> :" + result.onion);
「ペイント」を出力します。関数は同じ長さの配列を持っている必要があります。
ここに更新されたメソッドがあります
Array.prototype.toObject = function(keys){
var obj = {};
if( keys.length == this.length)
while( keys.length )
obj[ keys.pop() ] = this[ keys.length ];
return obj;
};
let i = 0;
let myArray = ["first", "second", "third", "fourth"];
const arrayToObject = (arr) =>
Object.assign({}, ...arr.map(item => ({[i++]: item})));
console.log(arrayToObject(myArray));
または使用
myArray = ["first", "second", "third", "fourth"]
console.log({...myArray})
ES5-ソリューション:
使用するアレイプロトタイプ機能「プッシュ」をして「適用」あなたは、配列の要素を持つオブジェクトを移入することができます。
var arr = ['a','b','c'];
var obj = new Object();
Array.prototype.push.apply(obj, arr);
console.log(obj); // { '0': 'a', '1': 'b', '2': 'c', length: 3 }
console.log(obj[2]); // c
{ name: a, div :b, salary:c}
これがcoffeescriptの解決策です
arrayToObj = (arr) ->
obj = {}
for v,i in arr
obj[i] = v if v?
obj
obj[i] = v for v,i in arr when v?