【问题标题】:Filter within a filter is working in one case, while it doesn't in another过滤器中的过滤器在一种情况下有效,而在另一种情况下无效
【发布时间】:2020-05-27 14:06:11
【问题描述】:

所以我碰巧浏览了这两个帖子:

  1. ES6 .filter within a .filter

    [ { "id": 0, "title": "happy dayys", "owner": {"id": "1", "username": "dillonraphael"}, "tags": [{"value": "Art", "label": "Art"}], "items": [] }, { "id": 1, "title": "happy dayys", "owner": {"id": "1", "username": "dillonraphael"}, "tags": [{"value": "Architecture", "label": "Architecture"}], "items": [] }, ]

在此 OP 中,尝试通过无效的嵌套过滤器过滤数据:

const tagMoodboards = _moodboards.filter(mb => { return mb.tags.filter(t => t.value == name) });

原因是内部 filter 返回一个数组(真实),所以对于外部数组,它变成这样 _moodboards.filter(mb => true) 因此它打印整个数组

然后有类似的问题

  1. How to filter nested array in javascript

哪里有这样的数据:

{
  "list": [
    {
      "deviceId": "2a-d539-4031-9bfc-4a42f2f765cf",
      "versions": [
        {
          "id": "764c20-a213-9235f4b553b3",
          "createdTime": 1590361208034,
          "files": [
            {
              "fileType": "VLAN"
            },
            {
              "fileType": "STARTUPCONFIG",
            }
          ],
          "startupRunningStatus": "OUT_OF_SYNC",
          "createdBy": "SCHEDULED"
        },
        {
          "id": "9bd33-a45a-ed2fefc46931",
          "createdTime": 1589972337717,
          "files": [
            {
              "fileType": "VLAN",
            },
            {
              "fileType": "STARTUPCONFIG",
            },
            {
              "fileType": "RUNNINGCONFIG",
            }
          ],
          "startupRunningStatus": "IN_SYNC",
          "createdBy": "SCHEDULED_FIRST_TIME"
        }
      ]
    }
  ]
}

并且 OP 想要过滤数据,它应该只返回存在“fileType”:“RUNNINGCONFIG”和“fileType”:“STARTUPCONFIG”的数组

但在这种情况下,filter 中的 filter 似乎可以完成这项工作

let versionsData = obj.list[0].versions; versionsData = versionsData.filter( versions => { return versions.files.filter( m => { return m.fileType === "RUNNINGCONFIG" || m.fileType === "STARTUPCONFIG" }).length > 1 } ); console.log(versionsData);

在第二种情况下,我觉得它应该遵循相同的模式 versionData = versionData.filter(versions => true) 因此返回完整的数组。

那么,我的问题是我到底错过了什么?我哪里错了?

【问题讨论】:

  • 不要把别人的代码放在你自己的里面。只需说明您的问题(使用数据)、您的尝试和您想要的输出。

标签: javascript arrays filter


【解决方案1】:

您必须将其更改为:

const tagMoodboards = _moodboards.filter(mb => { return mb.tags.filter(t => t.value == name).length });

对于拉胡尔: 将此代码粘贴到浏览器控制台中:

let arr = [
    {
    "id": 0,
    "title": "happy dayys",
    "owner": {"id": "1", "username": "dillonraphael"},
    "tags": [{"value": "Art", "label": "Art"}],
    "items": []
    },
    {
    "id": 1,
    "title": "happy dayys",
    "owner": {"id": "1", "username": "dillonraphael"},
    "tags": [{"value": "Architecture", "label": "Architecture"}],
    "items": []
    },
];

console.info(arr.filter(mb => { return mb.tags.filter(t => t.value == 'Art') })); // -> 2 hits (=wrong)
console.info(arr.filter(mb => { return mb.tags.filter(t => t.value == 'Art').length })); // -> 1 hit (=right)

【讨论】:

  • 这到底应该怎么做?
  • 如果名字是'Art',你会得到一击。如果您没有“.length”,您将获得两次命中(完整数组)。
  • .length 告诉您数组的长度。所以mb.tags.filter(t => t.value == name).length 是一个数字。如果为 0,则为假,条目被过滤掉。如果不为 0,则为真,包含该条目。确实有效的情况类似,但使用> 0,显式转换为布尔值。
  • @DavidKnipe 我想我现在有点明白了。不过,我需要澄清一下,如果我不输入length,它仍会返回truthyfalsy 中的内容。在这两种情况下,它都变为 myArray.filter(i=> truefalse);所以它应该返回整个数组(取决于truthy 条件或基于false 的空数组)。那么length 现在对结果有何影响?
  • 没有.length,它只是数组本身。在 javascript 中,数组总是真实的,即使它们是空的。例如。试试if ([]) { console.log('This empty array is truthy'); },或console.log(!![]);
猜你喜欢
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多