基于偶数/奇数索引将数组转换为对象

时间:2016-10-31 07:08:53

标签: javascript arrays underscore.js

我试图根据数组的索引是奇数还是偶数将数组转换为对象。

例如,

输入:   ["name", "Tom", "age", 20]

输出:{ "name": "tom","age": 20 }

可以使用JavaScript的基本功能实现,例如forEachmapfilter。但我想要更简单的代码。

所以我检查了underscore.js的文档,但我找不到一个好方法。 有什么方法可以解决这个问题吗?

6 个答案:

答案 0 :(得分:5)

有趣的问题,我的两分钱:

循环简单且高效:

const simpleArray = ["name", "Tom", "age", 20];

// Modifying the Array object
Array.prototype.toObject = function() {
    let r = {};

    for(let i = 0; i < this.length; i += 2) {
        let key = this[i], value = this[i + 1];
        r[key] = value;
    }

    return r;
}

// Or as a function
const toObject = arr => {
    let r = {};

    for(let i = 0; i < arr.length; i += 2) {
        let key = arr[i], value = arr[i + 1];
        r[key] = value;
    }

    return r;
}

const simpleObjectOne = simpleArray.toObject(); // First method
const simpleObjectTwo = toObject(simpleArray); // Second method

答案 1 :(得分:3)

你可以使用Array#forEach并检查索引,如果不均匀,则将元素分配给最后一项的键。

&#13;
&#13;
var array =  ["name", "Tom", "age", 20],
    object = {};

array.forEach(function (a, i, aa) {
    if (i & 1) {
        object[aa[i - 1]] = a;
    }
});

console.log(object);
&#13;
&#13;
&#13;

Array#reduce

相同

&#13;
&#13;
var array =  ["name", "Tom", "age", 20],
    object = array.reduce(function (r, a, i, aa) {
        if (i & 1) {
            r[aa[i - 1]] = a;
        }
        return r;
    }, {});

console.log(object);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

var input = ["name", "Tom", "age", 20] ;
var output = {}
input.forEach((x, i, arr) => {
  if (i % 2 === 0) output[x] = arr[i+1];
});
console.log(output); //{ name: 'Tom', age: 20 }

答案 3 :(得分:1)

您也可以使用reduce

var arr = ["name", "Tom", "age", 20],
    obj = arr.reduce((p,c,i,a) => (i%2 ? p[a[i-1]] = c : p[c],p),{});
console.log(obj);

此操作如下;

答案 4 :(得分:1)

下划线解决方案:

output = _.object(..._.partition(input, (_, i) => !(i % 2)))

_.partition会将数组分区为[['name', 'age'], ["tom", "20"]]。换句话说,它返回一个包含两个子数组的数组 - 在本例中,是一个键数组和一个值数组。 _.object将一组键和一组值作为参数,因此我们使用..._.partition返回的值中的子数组作为两个参数传递给它。

如果您使用非常实用的语义代码:

const even = i => !(i % 2);
const index = fn => (_, i) => fn(i);

output = _.object(..._.partition(input, index(even)))

递归解决方案:

function arrayToObject([prop, value, ...rest], result = {}) {
  return prop ? arrayToObject(rest, Object.assign(result, {[prop]: value})) : result;
}

迭代解决方案:

function arrayToObject(arr) {
  const result = {};
  while (arr.length) result[arr.shift()] = arr.shift();
  return result;
}

答案 5 :(得分:0)

一个简单的for循环

var arr = ["name", "Tom", "age", 20, "address"];
var obj = {};
for (var i = 0; i < arr.length; i+=2){
    //First iteration: assign obj["name"] to "Tom"
    //Second iteration: assign obj["age"] to 20
    //Third iteration: assign obj["address"] to "" because arr[5] does not exist
    obj[arr[i]] = arr[i+1] || "";
}