【问题标题】:Filtering data from json response object从 json 响应对象中过滤数据
【发布时间】:2018-12-20 21:19:33
【问题描述】:

我有一个返回 JSON 响应对象的 API 调用。数据的形状有点令人困惑,我无法弄清楚运行.map().filter() 以获得我想要的结果的确切对象。

  .then(response => {
    console.log(response); //see below for shape of data
    var dataSourceInfo = response.data.included.filter(
      element => element.type === "DataSource"
    );
    var dataSourceName = dataSourceInfo.map(function(included) {
      return included["name"];
    });
    console.log(dataSourceName);

在这两个数组中,我试图过滤 response.data.included 以按类型查找元素。然后映射返回的过滤器以创建一个新的有序数组。在其中一个included 数组中有一个标识typeDataSource,这是一个示例:

included: [
  {
    id: "2147483604",
    type: "DataSource",
    name: "Some DataSource"
  }, 

我正在记录dataSourceName,但该数组只有一个预期的名称,而且它只来自第一个数组,所以就好像地图没有到达第二个data.data。知道如何让两个名称都出现在过滤后的数组中吗?

编辑:正确的响应对象在代码框里

【问题讨论】:

  • 我很难理解您的问题
  • 我可以看到response 是一个数组,所以response.data 应该会抛出一个错误。应该是response[0].dataresponse.forEach/map/filter()
  • 预期结果是什么?
  • 所以在response[0]response[1]included 数组之一中有一个DataSourcetype 元素,所以过滤器映射应该返回[ dataSourceName1, dataSourceName2]
  • 您为响应对象添加的文本表示一定有错误。您将其描述为 一个 元素(不是两个)的数组,并且该元素是您在其中定义 data 属性两次的对象,因此只有一个可以存活(一个对象不能有两个同名的属性)。

标签: javascript arrays json


【解决方案1】:

如果我对您的理解正确,您需要一个 names 的平面列表,其中 type"DataSource",输入如下所示:

const response = {
  data: [
    {
      data: {
        data: {
          included: [
            { type: 'DataSource', name: 'First' },
            { type: 'Blah', name: 'Second' },
            { type: 'DataSource', name: 'Third' }
          ]
        }
      }
    },
    {
      data: {
        data: {
          included: [
            { type: 'DataSource', name: 'Fourth' },
            { type: 'Blah', name: 'Fifth' },
            { type: 'DataSource', name: 'Sixth' }
          ]
        }
      }
    },
  ]
}

const result = response.data.flatMap(({data: {data: {included}}}) => 
  included.reduce((memo, {type, name}) => {
    if (type === 'DataSource') {
      memo.push(name)
    }
    return memo;
  }, [])
)

console.log(result)

我已经省略了与问题无关的部分响应

更新:

这里的代码调整为与https://codesandbox.io/s/ympo7pr0xx 中列出的responseObject 一起使用

const responseObject = [ { data: { data: { id: "2147483605", selfUri: "/schedules/2147483605", type: "Schedule", startTime: 1545409610826, status: "InProgress", query: { id: "2147483603", selfUri: "/queries/2147483603", type: "Query" }, dataSource: { id: "2147483604", selfUri: "/datasources/2147483604", type: "DataSource" } }, included: [ { id: "2147483603", selfUri: "/queries/2147483603", type: "Query", name: "Query1", status: "Scheduled", querySchema: { id: "2147483601", selfUri: "/queryschemas/2147483601", type: "QuerySchema" } }, { id: "2147483601", selfUri: "/dataschemas/2147483601", type: "DataSchema", name: "Phone Data" }, { id: "2147483601", selfUri: "/queryschemas/2147483601", type: "QuerySchema", name: "QS1", dataSchema: { id: "2147483601", selfUri: "/dataschemas/2147483601", type: "DataSchema" }, queriesUri: "/queryschemas/2147483601/queries" }, { id: "2147483604", selfUri: "/datasources/2147483604", type: "DataSource", name: "Standalone- 5K", description: "Standalone 5K record" } ] } }, { data: { data: { id: "2147483606", selfUri: "/schedules/2147483606", type: "Schedule", startTime: 1545410049652, status: "Pending", query: { id: "2147483603", selfUri: "/queries/2147483603", type: "Query" }, dataSource: { id: "2147483608", selfUri: "/datasources/2147483608", type: "DataSource" } }, included: [ { id: "2147483608", selfUri: "/datasources/2147483608", type: "DataSource", name: "Standalone 5", description: "Standalone 5 record" }, { id: "2147483603", selfUri: "/queries/2147483603", type: "Query", name: "Query1", status: "Scheduled", querySchema: { id: "2147483601", selfUri: "/queryschemas/2147483601", type: "QuerySchema" }, schedulesUri: "/queries/2147483603/schedules" }, { id: "2147483601", selfUri: "/dataschemas/2147483601", type: "DataSchema", name: "Phone Data" }, { id: "2147483601", selfUri: "/queryschemas/2147483601", type: "QuerySchema", name: "QS1", dataSchema: { id: "2147483601", selfUri: "/dataschemas/2147483601", type: "DataSchema" } } ] } } ];

const result = responseObject.flatMap(({data: {included}}) => 
  included.reduce((memo, {type, name}) => {
    if (type === 'DataSource') {
      memo.push(name)
    }
    return memo;
  }, [])
)

console.log(result)

【讨论】:

  • 我已经更新了我的初始帖子,也许这会让你更清楚地了解。我省略了不相关的 included 数组。所以使用地图和过滤器我应该得到[Standalone 5K, Records 5K]。它目前只返回名字[Standalone 5K]
  • 好的,看起来唯一的区别是一个额外的嵌套 data - 更新
  • 实际上,我回滚了更改 - 我的代码不符合您的要求吗?
  • 您发布的示例 responseObject 看起来不正确,它具有以下形状:[{ data: { ... }, data: { ... } }],即有一个带有两个 data 键的对象 - 第二个 data 将覆盖第一个
  • @DJ2 帖子中responseObject的形状不正确。阅读以前的cmets
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多