เป็นวิธีที่ดีที่สุดในการแปลงอะไร:
['a','b','c']
ถึง:
{
0: 'a',
1: 'b',
2: 'c'
}
_.toPlainObject
คือ Ex:var myObj = _.toPlainObject(myArr)
เป็นวิธีที่ดีที่สุดในการแปลงอะไร:
['a','b','c']
ถึง:
{
0: 'a',
1: 'b',
2: 'c'
}
_.toPlainObject
คือ Ex:var myObj = _.toPlainObject(myArr)
คำตอบ:
ECMAScript 6 แนะนำ polyfillable ได้อย่างง่ายดายObject.assign
:
Object.assign()
วิธีการที่ใช้ในการคัดลอกค่าของคุณสมบัติของตัวเองทั้งหมดนับจากวัตถุหนึ่งหรือหลายแหล่งไปยังวัตถุเป้าหมาย มันจะกลับวัตถุเป้าหมาย
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()
ทำงาน
[]
) ถ้าคุณจะไม่ใช้คีย์คุณสมบัติตัวเลขและคุณสมบัติ "ความยาว"
const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
คุณสามารถใช้สะสม reduce
aka
['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
; คุณควรระบุ polyfill สำหรับเบราว์เซอร์ที่ไม่รองรับ (โดยเฉพาะ IE8)
หากคุณกำลังใช้ 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
สำหรับ "object" ที่นี่แม้ว่าinstanceof Array
จะไม่ ...
แปลกใจที่ไม่เห็น -
console.log(
Object.assign({}, ['a', 'b', 'c'])
)
{ "first":"a", "second":"b","third":"c" }
ด้วยกุญแจที่ถูกแก้ไข - ฉันกำลังมองหาการทำลาย
เราสามารถใช้Object.assign
และarray.reduce
ฟังก์ชั่นในการแปลง Array เป็น Object
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()
สิ่งใด ๆ นอกจากทำสำเนาคีย์: ค่าจากวัตถุหนึ่งไปอีกวัตถุหนึ่ง ในกรณีของเรามอบคุณสมบัติใหม่Array
{}
O.assign
แต่มันไม่มีคำอธิบาย ทุกวันนี้การทำลายล้างอาเรย์เข้าไปในวัตถุเป็นวิธี ( {...array}
)
สำหรับ ES2016 ผู้ปฏิบัติงานสเปรดสำหรับวัตถุ หมายเหตุ: นี่คือหลังจาก ES6 และต้องมีการปรับ transpiler
const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"}
ห้าปีต่อมามีวิธีที่ดี :)
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;
คุณสามารถใช้ตัวดำเนินการสเปรด
x = [1,2,3,10]
{...x} // {0:1, 1:2, 2:3, 3:10}
หากคุณใช้ ES6 คุณสามารถใช้ Object.assign และผู้ดำเนินการแพร่กระจาย
{ ...['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), {})
[เอกสาร]
หรือมากกว่า verbose
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()
ฉันจะทำเช่นนี้เพียงกับ Array of มีความสามารถในการใช้บริบทเป็นคอนสตรัคเตอร์
หมายเหตุ 2 ฟังก์ชั่นเป็นวิธีการที่โรงงานทั่วไปจงใจ; ไม่ต้องการให้ค่านี้เป็นตัวสร้าง Array ดังนั้นมันสามารถถ่ายโอนไปยังหรือสืบทอดโดยตัวสร้างอื่น ๆ ที่อาจถูกเรียกด้วยอาร์กิวเมนต์ตัวเลขเดียว
ดังนั้นเราอาจผูกArray.of()
กับฟังก์ชั่นและสร้างอาร์เรย์เช่นวัตถุ
function dummy(){};
var thingy = Array.of.apply(dummy,[1,2,3,4]);
console.log(thingy);
โดยใช้หนึ่งยังสามารถทำอาร์เรย์ย่อยArray.of()
classing
หากคุณสามารถใช้Map
หรือObject.assign
มันง่ายมาก
สร้างอาร์เรย์:
const languages = ['css', 'javascript', 'php', 'html'];
ด้านล่างสร้างวัตถุที่มีดัชนีเป็นคีย์:
Object.assign({}, languages)
ทำซ้ำเช่นเดียวกันกับ Maps
แปลงเป็นวัตถุตามดัชนี{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 ) );
}
ใช้ like:
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 - โซลูชัน:
การใช้ฟังก์ชั่นต้นแบบArray 'push'และ'Apply'คุณสามารถเติมวัตถุด้วยองค์ประกอบอาร์เรย์
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}
เบราว์เซอร์ที่รองรับเพิ่มเติมและวิธีการทำที่ยืดหยุ่นมากขึ้นโดยใช้การวนซ้ำปกติเช่น:
const arr = ['a', 'b', 'c'],
obj = {};
for (let i=0; i<arr.length; i++) {
obj[i] = arr[i];
}
แต่วิธีที่ทันสมัยสามารถใช้ตัวดำเนินการสเปรดได้เช่น:
{...arr}
หรือวัตถุที่ได้รับมอบหมาย :
Object.assign({}, ['a', 'b', 'c']);
ทั้งสองจะกลับมา :
{0: "a", 1: "b", 2: "c"}
คุณสามารถใช้ฟังก์ชั่นเช่นนี้:
var toObject = function(array) {
var o = {};
for (var property in array) {
if (String(property >>> 0) == property && property >>> 0 != 0xffffffff) {
o[i] = array[i];
}
}
return o;
};
อันนี้ควรจัดการกับอาร์เรย์เบาบางมีประสิทธิภาพมากขึ้น
นี่คือวิธีแก้ปัญหาในกาแฟ
arrayToObj = (arr) ->
obj = {}
for v,i in arr
obj[i] = v if v?
obj
obj[i] = v for v,i in arr when v?