使用 lodash 将数组转换为对象
convert array to object using lodash
我需要将一个数组或一个数组数组转换为一个对象,该对象具有从名称数组命名的键。示例:
//given names
names = ['first', 'second', 'third', 'fourth']
//array
param = [1, 2, 3, 4]
//becomes
result = {first: 1, second: 2, third: 3, fourth: 4}
//array of arrays
param = [
[1, 2, 3, 4],
[-4, 3, 1, 32],
]
//becomes
result = [
{first: 1, second: 2, third: 3, fourth: 4},
{first: -4, second: 3, third: 1, fourth: 32},
]
我目前的解决方案是这样的:
var names = ['first', 'second', 'third', 'forth'];
function arrayToObject(array, names) {
var result = {};
for (var i = 0; i < array.length; i++) {
if (typeof array[i] === 'object') {
result[i] = arrayToObject(array[i], names);
continue;
}
result[names[i]] = array[i];
}
return result;
}
这个解决方案的问题是它总是 return 一个对象,尽管当我传入一个数组时它应该 return 一个对象数组。有没有办法用 lodash 做到这一点,但我没有看到它?
Vanilla JS:从数组创建对象的函数:
function toObj(arr) {
return arr.reduce(function(p, c, i) {
p[names[i]] = c;
return p;
}, {});
}
与map
一起使用:
var out = arr.map(toObj);
您可以使用 _.zipObject()
将两个数组压缩成一个 object。您实际上是将 headers 的 CSV 数据映射到 JavaScript objects.
您可以尝试搜索 JavaScript CSV 转换器。您可能会发现一些有趣的结果。
// Given names
var names = [ 'first', 'second', 'third', 'fourth' ];
// Array
var param = [ 1, 2, 3, 4 ];
// Becomes
var result = _.zipObject(names, param);
document.body.innerHTML = JSON.stringify(result, null, 2);
// Array of arrays
var param = [
[ 1, 2, 3, 4 ],
[ -4, 3, 1, 32 ],
];
// Becomes
var result = _.chain(param).map(function(p) {
return _.zipObject(names, p)
}).value();
document.body.innerHTML += '\n\n' + JSON.stringify(result, null, 2);
body {
font-family: monospace;
white-space: pre;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>
我需要将一个数组或一个数组数组转换为一个对象,该对象具有从名称数组命名的键。示例:
//given names
names = ['first', 'second', 'third', 'fourth']
//array
param = [1, 2, 3, 4]
//becomes
result = {first: 1, second: 2, third: 3, fourth: 4}
//array of arrays
param = [
[1, 2, 3, 4],
[-4, 3, 1, 32],
]
//becomes
result = [
{first: 1, second: 2, third: 3, fourth: 4},
{first: -4, second: 3, third: 1, fourth: 32},
]
我目前的解决方案是这样的:
var names = ['first', 'second', 'third', 'forth'];
function arrayToObject(array, names) {
var result = {};
for (var i = 0; i < array.length; i++) {
if (typeof array[i] === 'object') {
result[i] = arrayToObject(array[i], names);
continue;
}
result[names[i]] = array[i];
}
return result;
}
这个解决方案的问题是它总是 return 一个对象,尽管当我传入一个数组时它应该 return 一个对象数组。有没有办法用 lodash 做到这一点,但我没有看到它?
Vanilla JS:从数组创建对象的函数:
function toObj(arr) {
return arr.reduce(function(p, c, i) {
p[names[i]] = c;
return p;
}, {});
}
与map
一起使用:
var out = arr.map(toObj);
您可以使用 _.zipObject()
将两个数组压缩成一个 object。您实际上是将 headers 的 CSV 数据映射到 JavaScript objects.
您可以尝试搜索 JavaScript CSV 转换器。您可能会发现一些有趣的结果。
// Given names
var names = [ 'first', 'second', 'third', 'fourth' ];
// Array
var param = [ 1, 2, 3, 4 ];
// Becomes
var result = _.zipObject(names, param);
document.body.innerHTML = JSON.stringify(result, null, 2);
// Array of arrays
var param = [
[ 1, 2, 3, 4 ],
[ -4, 3, 1, 32 ],
];
// Becomes
var result = _.chain(param).map(function(p) {
return _.zipObject(names, p)
}).value();
document.body.innerHTML += '\n\n' + JSON.stringify(result, null, 2);
body {
font-family: monospace;
white-space: pre;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>