【问题标题】:Filter based on value of nested array of objects in Typescript基于Typescript中嵌套对象数组的值进行过滤
【发布时间】:2019-08-27 19:57:09
【问题描述】:

我的 json 数据结构如下:

[
{"domain":"d1",
"technology":"Java",
"artifacts[{ 
  "artifactName":"app1",
  "hasVersionDiff":true,
  "environment":["DEV","SQA"],
  "version":["Not Available","1.0-R1"]
}]},

{"domain":"d2",
"technology":".net",
"artifacts[{ 
  "artifactName":"app4",
  "hasVersionDiff":false,
  "environment":["DEV","SQA"],
  "version":["1.0-R1","1.0-R1"]}]
}]

这个结果是 compareResults 变量。现在我试图根据每条记录的工件数据(hasVersionDiff 标志为真)来过滤它。我正在尝试使用以下过滤:

this.compareResults.map(function(ComparisonResult) {
        ComparisonResult.artifacts = ComparisonResult.artifacts.filter(x => x.hasVersionDiff == true)
    });

但它没有过滤,有人可以解释为什么这不起作用吗?

【问题讨论】:

  • 你能分享你输入的预期输出吗?

标签: javascript arrays typescript object filter


【解决方案1】:

因为map,你需要return这个新项目。 (我还修复了您的对象结构以使其有效):

const compareResults = [{
    "domain": "d1",
    "technology": "Java",
    "artifacts": [{
      "artifactName": "app1",
      "hasVersionDiff": true,
      "environment": ["DEV", "SQA"],
      "version": ["Not Available", "1.0-R1"]
    }]
  },

  {
    "domain": "d2",
    "technology": ".net",
    "artifacts": [{
      "artifactName": "app4",
      "hasVersionDiff": false,
      "environment": ["DEV", "SQA"],
      "version": ["1.0-R1", "1.0-R1"]
    }]
  }
];

const modified = compareResults.map(function(ComparisonResult) {
  ComparisonResult.artifacts = ComparisonResult.artifacts.filter(x => x.hasVersionDiff);
  return ComparisonResult;
});

console.log(modified);
.as-console-wrapper { max-height: 100% !important; top: auto; }

如果您想在artifacts 为空的情况下删除整个对象:

const compareResults = [{
    "domain": "d1",
    "technology": "Java",
    "artifacts": [{
      "artifactName": "app1",
      "hasVersionDiff": true,
      "environment": ["DEV", "SQA"],
      "version": ["Not Available", "1.0-R1"]
    }]
  },

  {
    "domain": "d2",
    "technology": ".net",
    "artifacts": [{
      "artifactName": "app4",
      "hasVersionDiff": false,
      "environment": ["DEV", "SQA"],
      "version": ["1.0-R1", "1.0-R1"]
    }]
  }
];

const modified = compareResults.map(function(ComparisonResult) {
  ComparisonResult.artifacts = ComparisonResult.artifacts.filter(x => x.hasVersionDiff);
  return ComparisonResult;
}).filter(({ artifacts }) => artifacts.length);

console.log(modified);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 谢谢杰克!效果很好,如果工件内部没有数据,有没有办法不返回域、技术?
  • @user2262292 怎么样?
  • 耶耶耶耶耶耶耶耶!谢谢@Jack
  • 总是乐于帮助@user2262292
  • 一个问题,当我这样做时,我的原始数据似乎也在发生变化,对于 compareResults 的第二条记录,工件没有显示任何价值,有没有办法不修改原始数据?
【解决方案2】:

我实现了递归函数,使用该函数可以从上到下逐层过滤嵌套的对象数组。在TS playground中探索、播放和修改我的脚本

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2018-01-27
    • 1970-01-01
    • 2021-08-04
    • 2020-09-17
    相关资源
    最近更新 更多