[英]Recursive method for retrieving and concatenating deeply nested arrays from string key
我正在尝试使用带有嵌套数组的object
,给它们一个string key
并返回一个串联值的数组,因此:
说我有以下数据:
let data = {
artists: [{
name: "Foo",
concerts: [{
arena: "Wembley",
city: "London"
}, {
arena: "NEC",
city: "Birmingham"
}]
}, {
name: "Bar",
concerts: [{
arena: "Madison Square Garden",
city: "New York"
}, {
arena: "Kodak Theatre",
city: "Los Angeles"
}]
}]
}
我希望能够传递以下字符串:
artists.concerts.arena
并让它为每个对象返回arena
所有值的数组,因此在这种情况下,我想要:
["Wembly", "NEC", "Madison Square Garden", "Kodak Theatre"]
我遇到的困难在于递归元素,我想我只是没有正确设置和返回值,或者我错误地调用了递归元素,这是(相当粗糙的)代码:
function getValueByStringPath(path, data) {
path = (Array.isArray(path)) ? path : path.split(".");
// Loop through the path
for (var i = 0; i < path.length; i++) {
if (Array.isArray(data)) {
let vals = [];
// We have an array, so lets loop through it
for (var j = 0; j < data.length; j++) {
// if we have more properties so get them
if (path.length - 1 > i) {
vals = getValueByStringPath(path[i + 1], data[j][path[i]])
} else {
vals.push(data[j][path[i]]);
}
}
return vals;
} else {
data = data[path[i]];
}
}
return (Array.isArray(data)) ? data : [data];
}
这是一个JSFiddle: https ://jsfiddle.net/p0eadu5h/
您可以使用嵌套的for..of
循环返回预期结果
let data = { artists: [{ name: "Foo", concerts: [{ arena: "Wembley", city: "London" }, { arena: "NEC", city: "Birmingham" }] }, { name: "Bar", concerts: [{ arena: "Madison Square Garden", city: "New York" }, { arena: "Kodak Theatre", city: "Los Angeles" }] }] } let res = []; for (let {concerts} of data.artists) { for (let {arena} of concerts) { res = [...res, arena] } } console.log(res);
您还可以在艺术家数组上进行链图缩小
var data = { artists: [{ name: "Foo", concerts: [{ arena: "Wembley", city: "London" }, { arena: "NEC", city: "Birmingham" }] }, { name: "Bar", concerts: [{ arena: "Madison Square Garden", city: "New York" }, { arena: "Kodak Theatre", city: "Los Angeles" }] }] }; var res = data.artists.map(x => x.concerts).reduce((a,b) => a.concat(b)).map(y => y.arena); console.log(res);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.