แปลง Array เป็น Object


514

เป็นวิธีที่ดีที่สุดในการแปลงอะไร:

['a','b','c']

ถึง:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

3
บางทีสิ่งที่เขาต้องการคือรหัสการพิมพ์เป็ดบางอย่างที่จะไม่คิดว่ามันเป็น Array instance
Pointy

6
มันมีค่าชี้ให้เห็นว่าอาร์เรย์ Javascript เป็นวัตถุ
Spudley

หากคนอื่นกำลังมองหาโซลูชัน Lodash ให้พิจารณา_.keyBy(ก่อนหน้านี้_.indexBy): lodash.com/docs#keyBy
2540625

นี้เป็นบิตสับสนเพราะอาร์เรย์เป็นวัตถุที่มีอยู่แล้ว แต่ผมคิดว่าประเด็นของคำถามที่มีการแปลงอาร์เรย์ วัตถุที่แปลกใหม่ไปยังวัตถุสามัญ
Oriol

1
วิธีง่ายๆในการทำเช่นนี้กับ Lodash _.toPlainObjectคือ Ex:var myObj = _.toPlainObject(myArr)
จูเลียน Soro

คำตอบ:


473

ECMAScript 6 แนะนำ polyfillable ได้อย่างง่ายดายObject.assign:

Object.assign()วิธีการที่ใช้ในการคัดลอกค่าของคุณสมบัติของตัวเองทั้งหมดนับจากวัตถุหนึ่งหรือหลายแหล่งไปยังวัตถุเป้าหมาย มันจะกลับวัตถุเป้าหมาย

Object.assign({}, ['a','b','c']); // {0:"a", 1:"b", 2:"c"}

เองlengthคุณสมบัติของอาร์เรย์จะไม่คัดลอกเพราะมันไม่ได้นับ

นอกจากนี้คุณสามารถใช้ไวยากรณ์การแพร่กระจาย ES6 เพื่อให้ได้ผลลัพธ์เดียวกัน:

{ ...['a', 'b', 'c'] }

แค่อยากจะชี้ให้เห็น - ถ้าคุณมีอาร์เรย์ของคุณสมบัติที่เรียงลำดับจากวัตถุเดิมที่ใช้การแพร่กระจายผู้ประกอบการคือสิ่งที่จะเปิดอาร์เรย์ที่โดยตรงในวัตถุใหม่:{ ...[sortedArray]}
HappyHands31

Oriol มีวิธีตั้งค่าคีย์คงที่แทน 0 & 1 หรือไม่?
Menai Ala Eddine

488

ด้วยฟังก์ชั่นเช่นนี้:

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()ทำงาน


2
@ m93a มันเป็นวัตถุอยู่แล้ว ใน JavaScript ไม่มีจุดที่สร้างอินสแตนซ์ของ Array ( []) ถ้าคุณจะไม่ใช้คีย์คุณสมบัติตัวเลขและคุณสมบัติ "ความยาว"
Pointy

14
วิธีที่สะอาดกว่าในการหลีกเลี่ยงการกำหนดใหม่ของ Paramconst obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
huygn

3
Arrow + ไวยากรณ์การทำลายล้างที่ไม่มีการส่งคืนอย่างชัดเจน:const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Marc Scheib

2
@eugene_sunic แน่นอน แต่ที่วิธีการก็ไม่สามารถใช้ได้เมื่อฉันตอบในปี 2010 นี้ :)
Pointy

2
@imiro ชี้ให้เห็นว่าการสร้างวัตถุใหม่ทุกครั้งไม่จำเป็นและในความเป็นจริงช้ากว่าการจัดการกับวัตถุเริ่มต้นที่ถูกสร้างขึ้น การรันการทดสอบ JSPerf ในอาร์เรย์ 1,000 องค์ประกอบการสร้างวัตถุใหม่ทุกครั้งช้ากว่าการกลายพันธุ์วัตถุที่มีอยู่1,000เท่า jsperf.com/…
romellem

281

คุณสามารถใช้สะสม reduceaka

['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)

ดูการดำเนินงานที่เริ่มต้นจากMozilla


1
มีประโยชน์ในการดูแลร้าน redux เมื่อคุณใช้แผนที่ของวัตถุและคุณจำเป็นต้องวางกุญแจอย่างใดอย่างหนึ่ง
dhruvpatel

101

หากคุณกำลังใช้ jquery:

$.extend({}, ['a', 'b', 'c']);

4
แปลกถ้าฉันให้ในตัวแปร Array มันทำให้ทุกตัวละครในวัตถุที่แยกต่างหาก: 0: "a", 1: ",", 2: "b" ... ดังนั้นมันจะละเว้นคำพูด แต่รวมถึงเครื่องหมายจุลภาค .. .
TrySpace

@ Max ฉันคิดว่ามันไม่มีพฤติกรรมแบบนั้น วัตถุที่ส่งคืนคือ{0: 'a', 1: 'b', 2: 'c'}ผลลัพธ์ที่คาดหวัง
ivkremer

3
มีวิธีใช้ $ .extend ในขณะที่แจ้งคีย์ด้วยวิธีที่ไม่ใช่ตัวเลขเช่น: การคำนวณ calcultations ในรายการอาร์เรย์หรือไม่
Davi Lima

การทดสอบสุดยอดเยี่ยมและสั้น
Faisal Mehmood Awan

63

เพื่อความสมบูรณ์ ECMAScript 2015 (ES6) การแพร่กระจาย จะต้องใช้ทั้ง transpiler (Babel) หรือสภาพแวดล้อมที่ทำงานอย่างน้อย ES6

console.log(
   { ...['a', 'b', 'c'] }
)


2
จริงๆแล้วสิ่งนี้ไม่ได้มีอยู่ใน ES2015 เช่นกัน มันเป็นสิ่งที่สวยงามมาก
Aluan Haddad

47

ฉันอาจเขียนด้วยวิธีนี้ (เนื่องจากแทบจะไม่ได้มีห้องสมุด underscorejs ในมือ):

var _ = require('underscore');

var a = [ 'a', 'b', 'c' ];
var obj = _.extend({}, a);
console.log(obj);
// prints { '0': 'a', '1': 'b', '2': 'c' }

9
คุณลงคะแนนการตอบสนองของฉัน แต่ไม่มีความคิดเห็น? คำตอบของฉันถูกต้องและผ่านการทดสอบ การคัดค้านคืออะไร?
เดฟ Dopson

14
คำถามนี้ไม่มีแท็กขีดล่างและคุณยังถือว่า node.js หรือไลบรารีที่ต้องการ
David Hellsing

10
ขีดล่างค่อนข้างทั่วไปทั้งบนไคลเอนต์และเซิร์ฟเวอร์ มันถูกใช้สำหรับ Backbone.js และอาจเป็นยูทิลิตี้ไลบรารีที่พบบ่อยที่สุด ที่ถูกกล่าวว่าฉันรวมสายต้องเพื่อให้ชัดเจนว่าฉันใช้ห้องสมุด ไม่มีซับในสำหรับการอธิบาย "เพิ่ม underscore.js ในหน้าของคุณ" ดังนั้นจึงจำเป็นต้องใช้การแปลบางอย่างสำหรับสภาพแวดล้อมของเบราว์เซอร์
Dave Dopson

6
ถึงกระนั้นหากคุณกำลังใช้ undserscore ง่าย ๆobj=_.extend({},a);ก็จะทำงาน นอกจากนี้ถ้าคุณมีการทำซ้ำผ่านอาร์เรย์ผมว่าน่าจะเหมาะสมกว่า_.each _.mapโดยรวมแล้วนี่ไม่ใช่คำตอบที่ดีในหลาย ๆ ระดับ
David Hellsing

4
คน "คุณต้องตอบโดยไม่พูดถึงขีดเส้นใต้หรือเส้นประ" น่ารำคาญมาก เปรียบได้กับการบอกว่าคุณต้องตอบคำถาม C ++ โดยไม่ต้องพูดถึงไลบรารีมาตรฐาน หากขีดเส้นใต้หรือ lo-dash ไม่ใช่ตัวเลือก OP ควรกล่าวถึงสิ่งนั้น
Charlie Martin

26

นี่คือวิธี 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

(1) ตามMDNการเปลี่ยน [[Prototype]] ของวัตถุเป็นการดำเนินการที่ช้ามาก (2) สิ่งนี้ไม่ได้ลบlengthคุณสมบัติของตัวเอง (3) Array.isArray(arr) === trueวัตถุยังคงเป็นอาร์เรย์ (4) พฤติกรรมอาร์เรย์พิเศษจะไม่ถูกลบออกเช่นarr.length = 0ลบดัชนีทั้งหมด (5) ดังนั้นฉันคิดว่าObject.assignดีกว่ามาก
Oriol

1
@Oriol mdn ผิดอย่างน้อยใน V8 (แต่ยังมีเอ็นจินอื่น ๆ ) นี่เป็นการทำงานที่รวดเร็วในกรณีนี้ - เนื่องจากวัตถุมีที่เก็บตัวเลขอยู่แล้วนี่เป็นการเปลี่ยนพอยน์เตอร์สองตัว
Benjamin Gruenbaum

นอกจากนี้ยังสามารถใช้สำหรับความจริงที่ว่ามันเป็นเอกลักษณ์ในหมู่วิธีแก้ปัญหาอย่างรวดเร็วอื่น ๆ ของการรักษาคุณสมบัติที่ไม่ใช่ดัชนี ("ของตัวเอง") ในอาร์เรย์ (เช่นคุณสมบัติที่ไม่ใช่บวกจำนวนเต็ม) ...
Brett Zamir

แต่อืมArray.isArrayกลับมาtrueสำหรับ "object" ที่นี่แม้ว่าinstanceof Arrayจะไม่ ...
Brett Zamir

@BrettZamir ที่ฟังดูเหมือนเป็นข้อผิดพลาด: D
Benjamin Gruenbaum

26

แปลกใจที่ไม่เห็น -

console.log(
  Object.assign({}, ['a', 'b', 'c'])
)


ข้อเสนอแนะที่ชาญฉลาดใด ๆ ที่จะสร้าง{ "first":"a", "second":"b","third":"c" }ด้วยกุญแจที่ถูกแก้ไข - ฉันกำลังมองหาการทำลาย
mplungjan

@mplungjan ฉันขอแนะนำให้ใช้การลดแทนการมอบหมายในกรณีนั้น อาจมีห้องสมุดที่อนุญาตให้คุณแจกแจงทุกลำดับถ้าจำเป็น
Wylliam Judd

ฉันมีกรณีอื่นในวันนี้ ฉันสิ้นสุดการถามคำถามเกี่ยวกับมัน: stackoverflow.com/questions/62197270/destruct-using-titles/
......

23

เราสามารถใช้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)


นี่คือสิ่งที่ฉันกำลังมองหา ฉันไม่ต้องการอินดัคส์ฉันจำเป็นต้องแปลงอาร์เรย์ให้เป็นคู่ค่าคีย์ที่เก็บรักษาไว้
Mike K

18

ฉันลงเอยด้วยการใช้ตัวดำเนินการกระจายวัตถุเนื่องจากเป็นส่วนหนึ่งของมาตรฐาน ECMAScript 2015 (ES6)

const array = ['a', 'b', 'c'];
console.log({...array});
// it outputs {0:'a', 1:'b', 2:'c'}

ทำซอต่อไปนี้เป็นตัวอย่าง


1
ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพการทำงานนี้ แต่จากการแปลง Array to Object เป็นจำนวนมาก (เนื่องจากฉันต้องการใช้วัตถุสำหรับรหัสทั้งหมดของฉันเพื่อสร้างมาตรฐาน) นี่อาจเป็นวิธีที่ง่ายที่สุด
คนพิเศษ

จะดีกว่าคำตอบที่มีอยู่แล้วที่ให้วิธีการแก้ปัญหาเดียวกันนี้ได้อย่างไร
Dan Dascalescu

17
Object.assign({}, ['one', 'two']); // {0: 'one', 1: 'two'}

วิธีที่ง่ายใน JavaScript สมัยใหม่คือการใช้Object.assign()สิ่งใด ๆ นอกจากทำสำเนาคีย์: ค่าจากวัตถุหนึ่งไปอีกวัตถุหนึ่ง ในกรณีของเรามอบคุณสมบัติใหม่Array{}


จะดีกว่าคำตอบที่มีอยู่แล้วที่ให้วิธีการแก้ปัญหาเดียวกันนี้ได้อย่างไร
Dan Dascalescu

Dan Dascalescu ในเวลาที่ฉันได้เพิ่มคำตอบมีคำตอบข้างต้นเกี่ยวกับO.assignแต่มันไม่มีคำอธิบาย ทุกวันนี้การทำลายล้างอาเรย์เข้าไปในวัตถุเป็นวิธี ( {...array})
Appeiron

13

สำหรับ ES2016 ผู้ปฏิบัติงานสเปรดสำหรับวัตถุ หมายเหตุ: นี่คือหลังจาก ES6 และต้องมีการปรับ transpiler

const arr = ['a', 'b', 'c'];
const obj = {...arr}; // -> {0: "a", 1: "b", 2: "c"} 


คำตอบที่ผู้ประกอบการได้รับการแพร่กระจายแล้ว2 ปีก่อนหน้านี้
Dan Dascalescu



10

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;


9

หากคุณใช้ ES6 คุณสามารถใช้ Object.assign และผู้ดำเนินการแพร่กระจาย

{ ...['a', 'b', 'c'] }

หากคุณมีอาเรย์ซ้อนกันเช่น

var arr=[[1,2,3,4]]
Object.assign(...arr.map(d => ({[d[0]]: d[1]})))

1
ไม่เพียง แต่ชื่อตัวแปรของคุณจะแตกต่างกันไป แต่ตัวอย่างของคุณจะไม่ทำงานการสร้างแผนที่จากนวกรรมิกจะต้องใช้ Array key-value 2d new Map([['key1', 'value1'], ['key2', 'value2']]);
Shannon Hochkins

5

หนึ่งที่รวดเร็วและสกปรก:

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และลดลงแทน
Phrogz

ใช่ .. แค่เปลี่ยนมัน แต่แล้วมันก็น่าสนใจน้อยลง: /
ไมค์

สามารถทำได้l = arr.lengthและจากนั้นwhile (l && (obj[--l] = arr.pop())){}(ฉันตระหนักว่านี่เก่า แต่ทำไมไม่ทำให้มันง่ายขึ้นไปอีก)
Qix - MONICA ถูกยกเลิกเมื่อ

2
@Qix, Nice shortening
ไมค์

4

รวดเร็วและสกปรก # 2:

var i = 0
  , s = {}
  , a = ['A', 'B', 'C'];

while( a[i] ) { s[i] = a[i++] };

ทำไมคุณถึงใช้เครื่องหมายจุลภาค?
คอนเนอร์ Ruhl

3
การตั้งค่าส่วนตัวเพื่อให้มีเครื่องหมายจุลภาคนำหน้าในบรรทัดถัดไป ฉันพบว่าสัญลักษณ์นี้อ่านง่ายขึ้น
BingeBoy

1
การวนซ้ำจะหยุดลงถ้าอาร์เรย์มีค่าที่เป็นเท็จ คุณควรตรวจสอบแทนi < a.length a[i]
Oriol


3

นี่คือฟังก์ชั่นวนซ้ำที่ฉันเพิ่งเขียน มันง่ายและทำงานได้ดี

// 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));

ผล: อาร์เรย์แบบเรียกซ้ำไปยังวัตถุ


ทำงานได้ดีจริงๆ ขอบคุณ
Hanmaslah

นี่ควรจะสูงกว่านี้ถ้าคุณมี['a' = '1', 'b' = '2', 'c' = '3']และต้องการให้มัน{a: 1, b: 2, c: 3}สมบูรณ์แบบ
Wanjia

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]อะไร มันจะมีประโยชน์มากขึ้นในการทำให้โค้ดสามารถประมวลผลได้
Dan Dascalescu

3

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


3

หากคุณสามารถใช้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

3

วิธีการที่ง่ายและทะลึ่งในการแปลงอาเรย์ของรายการเป็นวัตถุได้อย่างรวดเร็ว

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;
};

สิ่งนี้จะทำลายทั้งเนื้อหาอาเรย์ของคีย์และแม้ว่าจะมีความคิดเห็นภายใน แต่ก็ยังมีอาเรย์ค่า (เนื้อหาของมัน) JavaScript ทำงานแตกต่างจาก PHP กับ JavaScript โดยอัตโนมัติโดยอ้างอิงคุณสมบัติของวัตถุ / อาร์เรย์
Brett Zamir

ไม่เช่นนั้นงานประจำจะทำสำเนาไม่ได้สัมผัสต้นฉบับ
Mark Giblin

ใช่ต้นฉบับถูกจับ ดูjsfiddle.net/bRTv7 ความยาวของอาร์เรย์สิ้นสุดลงทั้งคู่เป็น 0
Brett Zamir

ตกลงรุ่นแก้ไขฉันเพิ่งเปลี่ยนมันไม่ทำลายอาร์เรย์พบว่าแปลกที่ควรทำ
Mark Giblin

1
วิธีการอัปเดตที่ควรได้รับการสนับสนุนในเบราว์เซอร์รุ่นเก่าเนื่องจาก JSON มีความยาวเกินกว่า ECMA ได้เพิ่มคุณสมบัติโค้ดใหม่
Mark Giblin

2

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})


2

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}
Prashant Pimpale

2

เบราว์เซอร์ที่รองรับเพิ่มเติมและวิธีการทำที่ยืดหยุ่นมากขึ้นโดยใช้การวนซ้ำปกติเช่น:

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"}

1

คุณสามารถใช้ฟังก์ชั่นเช่นนี้:

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;
};

อันนี้ควรจัดการกับอาร์เรย์เบาบางมีประสิทธิภาพมากขึ้น


1

นี่คือวิธีแก้ปัญหาในกาแฟ

arrayToObj = (arr) ->
  obj = {}
  for v,i in arr
    obj[i] = v if v?
  obj

7
กาแฟคืออะไร เรากำลังพูดถึง JS! : D
m93a

2
มันเป็นภาษาที่เล็ก ๆ น้อย ๆ ที่รวบรวมลงใน JavaScript :)
เดวิด

6
อืมมันใช้สัญกรณ์แปลก ๆ ฉันชอบ JS ธรรมดามากขึ้น
m93a

2
@ David คุณสามารถทำทั้งหมดให้วนซ้ำใน 1 บรรทัดเพื่อทำให้ทั้งหมดมีเพียง 3 บรรทัด :) ตัวอย่าง:obj[i] = v for v,i in arr when v?
XåpplI'-I0llwlg'I -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.