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

标签 javascript arrays recursion

我试图获取一个带有嵌套数组的对象,给它们一个字符串键并返回一个连接值的数组,所以:

假设我有以下数据:

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);

关于javascript - 从字符串键检索和连接深度嵌套数组的递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41044108/

相关文章:

c# - CustomValidator 不调用 javascript

JavaScript 删除语句。询问

javascript - 使用元素索引而不是值复制创建数组引用

c - 如何反转一个char数组,然后将反转后的char数组存储到另一个数组中?

javascript - 当用户不活跃时,如何使 PHP session 过期

javascript - 性能: CSS Transitions vs Javascript Effects

php - 从二维数组 PHP 中删除某些索引

javascript - Promise 中的 setTimeout - 如何解决以及为什么它只运行一次?

c++ - C++ 中的 MSD 基数排序(字典顺序)

javascript - 将字符串(Revit 公式)转换为 JavaScript 对象