我试图根据数组的索引是奇数还是偶数将数组转换为对象。
例如,
输入:
["name", "Tom", "age", 20]
输出:
{ "name": "tom","age": 20 }
可以使用
forEach
、map
、filter
等JavaScript的基本功能来实现。但我想要更简单的代码。
所以我检查了underscore.js的文档,但没有找到好的方法。 有什么办法可以简单解决这个问题吗?
有趣的问题,我的两分钱:
简单且高性能的 for 循环:
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
Array#forEach
并检查索引,如果不均匀,则将元素分配给最后一项的键。
var array = ["name", "Tom", "age", 20],
object = {};
array.forEach(function (a, i, aa) {
if (i & 1) {
object[aa[i - 1]] = a;
}
});
console.log(object);
Array#reduce
相同
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);
下划线解决方案:
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;
}
你也可以使用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);
此操作如下;
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 }
一个简单的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] || "";
}
const arr = ["name", "Tom", "age", 20, "address", "London"];
function parseParams([k, v, ...rest]) {
return k ? { [k]: v, ...parseParams(rest) } : {};
}
console.log(JSON.stringify(parseParams(arr), null, 3));
// e.g. node js to get arguments that way
// parseParams(process.argv.slice(2));