如何将数组转换为对象?

826
什么是最好的转换方式:
['a','b','c']

到:

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

2
如果其他人正在寻找Lodash解决方案,请考虑使用_.keyBy(以前称为_.indexBy):https://lodash.com/docs#keyBy - 2540625
1
这有点令人困惑,因为数组已经是对象了,但我猜问题的重点是将数组 异类对象转换为普通对象 - Oriol
3
使用 Lodash 来简单实现这个操作的方法是 _.toPlainObject。例如:var myObj = _.toPlainObject(myArr) - julian soro
46个回答

-1

初始数组将被转换为一个带有键的对象,这些键将是数组的唯一元素,键的值将是特定键重复出现的次数。

var jsTechs = ['angular', 'react', 'ember', 'vanilaJS', 'ember', 'angular', 'react', 'ember', 'vanilaJS', 'angular', 'react', 'ember', 'vanilaJS', 'ember', 'angular', 'react', 'ember', 'vanilaJS', 'ember', 'angular', 'react', 'ember', 'vanilaJS', 'ember', 'react', 'react', 'vanilaJS', 'react', 'vanilaJS', 'vanilaJS']

var initialValue = {
  java : 4
}

var reducerFunc = function reducerFunc (initObj, jsLib) {
  if (!initObj[jsLib]) {
    initObj[jsLib] = 1
  } else {
    initObj[jsLib] += 1
  }
  return initObj
}
var finalResult = jsTechs.reduce(reducerFunc, initialValue)
console.log(finalResult)


-1
我曾多次遇到此问题,决定编写一个尽可能通用的函数。请查看并随意修改任何内容。
function typeOf(obj) {
    if ( typeof(obj) == 'object' ) {
        if (obj.length)
            return 'array';
        else
            return 'object';
    } else
    return typeof(obj);
}

function objToArray(obj, ignoreKeys) {
    var arr = [];
    if (typeOf(obj) == 'object') {
        for (var key in obj) {
            if (typeOf(obj[key]) == 'object') {
                if (ignoreKeys)
                    arr.push(objToArray(obj[key],ignoreKeys));
                else
                    arr.push([key,objToArray(obj[key])]);
            }
            else
                arr.push(obj[key]);
        }
    }else if (typeOf(obj) == 'array') {
        for (var key=0;key<obj.length;key++) {
            if (typeOf(obj[key]) == 'object')
                arr.push(objToArray(obj[key]));
            else
                arr.push(obj[key]);
        }
    }
    return arr;
}

1
请注意,您的 "typeOf" 函数非常危险 - 有些对象恰好具有 "length" 属性。我建议使用 underscore.js 中的方法,例如 "_.isArray(obj)"。 - Dave Dopson
2
仅需检查 obj instanceof Array 而不是检查 length。 - Johan

-1
import books from "./books.json";

export const getAllBooks = () => {
  return {
    data: books,
    // a=accoumulator, b=book (data itelf), i=index
    bookMap: books.reduce((a, book, i) => {
      // since we passed {} as initial data, initially a={}
      // {bookID1:book1, bookID2:i}
      a[book.id] = book;
      // you can add new property index
      a[book.id].index=i
      return a;
      // we are passing initial data structure
    }, {}),
  };
};

-2

将我的版本数组转换为JS中的json。只需复制/粘贴并使用它。这不是很棒吗?我喜欢在StackOverflow上找到这种类型的函数。

function array2json(arr) {
    var parts = [];
    var is_list = (Object.prototype.toString.apply(arr) === '[object Array]');

    for(var key in arr) {
        var value = arr[key];
        if(typeof value == "object") { //Custom handling for arrays
            if(is_list) parts.push(array2json(value)); /* :RECURSION: */
            else parts[key] = array2json(value); /* :RECURSION: */
        } else {
            var str = "";
            if(!is_list) str = '"' + key + '":';

            //Custom handling for multiple data types
            if(typeof value == "number") str += value; //Numbers
            else if(value === false) str += 'false'; //The booleans
            else if(value === true) str += 'true';
            else str += '"' + value + '"'; //All other things
            // :TODO: Is there any more datatype we should be in the lookout for? (Functions?)

            parts.push(str);
        }
    }
    var json = parts.join(",");

    if(is_list) return '[' + json + ']';//Return numerical JSON
    return '{' + json + '}';//Return associative JSON
}

-5

var finalResult = ['a','b','c'].map((item , index) => ({[index] : item}));
console.log(finalResult)


3
返回一个对象数组。问题是关于一个以索引为键,以值为值的单个对象。 - its4zahoor

-10
更面向对象的方法:
Array.prototype.toObject = function() {
 var Obj={};

 for(var i in this) {
  if(typeof this[i] != "function") {
   //Logic here
   Obj[i]=this[i];
  }
 }

 return Obj;
}

17
这种方法存在几个问题:1;您正在扩展原生原型。2;您在数组中使用for in,这也会循环遍历数组的静态属性。3;为什么要排除函数? - David Hellsing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接