gpt4 book ai didi

javascript - JS/lodash - 将数组的数组转换为对象

转载 作者:行者123 更新时间:2023-11-30 08:26:28 24 4
gpt4 key购买 nike

我正在使用 lodash 开发 Node/JS,并尝试将数组数组转换为散列对象,这样:

[ [ 'uk', 'london', 'british museum' ],
[ 'uk', 'london', 'tate modern' ],
[ 'uk', 'cambridge', 'fitzwilliam museum' ],
[ 'russia', 'moscow', 'tretyakovskaya gallery' ],
[ 'russia', 'st. petersburg', 'hermitage' ],
[ 'russia', 'st. petersburg', 'winter palace' ],
[ 'russia', 'st. petersburg', 'russian museum' ] ]

变成这种hash/tree结构:

{ uk: { 
london: [ 'british museum', 'tate modern' ],
cambridge: [ 'fitzwilliam museum' ]
},
russia: {
moscow: [ 'tretyakovskaya gallery' ],
'st petersburg': ['hermitage', 'winter palace', 'russian museum']
}
}

到目前为止我已经使用了这种代码:

function recTree(arr) {
// We only take in arrays of arrays
if (arr.constructor === Array && arr[0].constructor === Array) {
// If array has a single element, return it
if (arr.length === 1) {
return arr[0];
}
// Group array by first element
let grouped = _.groupBy(arr, function(o) {
return o[0]
});
let clean = _.mapValues(grouped, function(o) {
return _.map(o, function(n) {
// Cut off first element
let tail = n.slice(1);

if (tail.constructor === Array && tail.length == 1) {
// If there is a single element, return it
return tail[0];
} else {
return tail;
}
});
});
return _.mapValues(clean, recTree)
} else {
// If it's not an array of arrays, return it
return arr;
}
}

我想知道是否有比我目前编写的程序更简洁、更实用的方法来执行此操作。理想情况下,我希望函数能够接受任意(但恒定,这样所有内部数组都相同)长度的数组(不仅仅是 3)

最佳答案

这是一个适用于任何可变长度数组的 lodash 解决方案。

  1. 使用 lodash#reduce将数组缩减为 object 形式。

  2. 在每次 reduce 迭代中:

    2.1。我们得到我们想要设置的值的 path,例如uk.london,使用 lodash#initial .

    2.2。使用 lodash#last , 从我们想要连接的内部数组中获取值。

    2.3 使用lodash#get使用 pathobject 获取任何现有数组,如果它没有获取任何值,则默认为空数组。获取值后,我们将内部数组的最后一项连接到获取的值。

    2.4 使用lodash#set使用取自 2.1 的 path 从取自 2.3 的 value 设置生成的 object


var result = _.reduce(array, function(object, item) {
var path = _.initial(item);
var value = _.get(object, path, []).concat(_.last(item));
return _.set(object, path, value);
}, {});

var array = [
['uk', 'london', 'british museum'],
['uk', 'london', 'tate modern'],
['uk', 'cambridge', 'fitzwilliam museum'],
['russia', 'moscow', 'tretyakovskaya gallery'],
['russia', 'st. petersburg', 'hermitage'],
['russia', 'st. petersburg', 'winter palace'],
['russia', 'st. petersburg', 'russian museum']
];

var result = _.reduce(array, function(object, item) {
var path = _.initial(item);
var value = _.get(object, path, []).concat(_.last(item));
return _.set(object, path, value);
}, {});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

关于javascript - JS/lodash - 将数组的数组转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44824823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com