繁体   English   中英

从字符串键检索和连接深层嵌套数组的递归方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM