【问题标题】:Ask for help on how to get all the filtered list from specific array寻求有关如何从特定数组中获取所有过滤列表的帮助
【发布时间】:2021-08-15 15:58:50
【问题描述】:

我在一个名为“Person”的数组中有一个对象。 在对象“Person”中,有一个名为“info”的数组。 我的目标是在按“性别:男性”过滤时,在数组“信息”中获取前缀为“年龄:”的所有值。所以,我想要的输出将是 1 到 9,因为我还想删除重复项。

以下是我的代码,但结果只有两个值(1 和 4)。也许输出是每人一个值。 我花了很多时间玩代码,但没有运气。这就是为什么我把我的问题提出来,希望任何这方面的专家可以帮助我。

<script>
var array = [
                {
                    "person": {
                        "info": [
                            "age:1",
                            "age:2",
                            "age:3",
                            "age:4",
                            "age:5",
                            "age:6",
                            "gender:male"
                        ]
                    },
                    "person": {
                        "info": [
                            "age:4",
                            "age:5",
                            "age:6",
                            "age:7",
                            "age:8",
                            "age:9",
                            "gender:male"
                        ]
                    },
                    "person": {
                        "info": [
                            "age:8",
                            "age:9",
                            "age:10",
                            "age:11",
                            "age:12",
                            "age:13",
                            "gender:female"
                        ]
                    }
                }
            ]
            var filteredAges = [];
            for (i = 0; i < array.length; i++) {
                var infoGroup = array[i].person.info,
                    ageGroup = [];
                    for (j = 0; j < infoGroup.length; j++) {
                        ageGroup.push(infoGroup[j]);
                        var ageInfo = ageGroup.find(ages => ages.includes('age:'));
                    }; 
                    if (ageInfo) { 
                        if (filteredAges.indexOf(ageInfo) == -1) { 
                            filteredAges.push(ageInfo)
                         }         
                      } 
              }

            for (i = 0;i < filteredAges.length; i++) {
                console.log(filteredAges[i]);
            }
</script>

【问题讨论】:

  • find 方法返回满足条件的数组的第一个元素。首先将age:4 粘贴到数组ageGroup 中,然后找到该数组的第一个元素,它包含age:。下一次迭代 - 你将age:5 推入你的数组,你的数组现在包含age:4age:5。现在您再次寻找包含age: 的第一个元素……当然,仍然是age:4
  • 你是对的。我的问题的原因是 find()。我用 filter() 替换了它,它现在可以工作了。谢谢

标签: javascript jquery arrays json


【解决方案1】:

似乎您所有的对象键都只是person

[
 {
  person: {...},
  person: {...},
  person: {...}
 }
]

所以当变量array 被评估时,它只有一个人

您需要重组您的数据,可能如下所示或类似的东西

示例 - 1

[
 { person: {...} },
 { person: {...} },
 { person: {...} },
]

示例 - 2

[
 [ { person: {...} } ],
 [ { person: {...} } ],
 [ { person: {...} } ]
]

修复此问题后,您可以尝试调试您的问题

如果您想获取info 数组中具有"age:" 的所有项目

你可以像这样使用filter

const ageInfos = [
                  "age:8", "age:9", 
                  "age:10", "age:11",
                  "age:12", "age:13",
                  "gender:female"
                 ].filter(x => x.startsWith("age:")) 

您的输出 - ageInfos 将是

["age:8", "age:9", "age:10", "age:11", "age:12", "age:13"]

您也可以使用Set 仅收集唯一字符串或将所有内容推送到数组中,然后使用Set 仅返回这样的唯一值

const arrayWithDuplicates = ['a', 1, 'a', 2, '1'];

const unique = [...new Set(arrayWithDuplicates)];

console.log(unique); // unique is ['a', 1, 2, '1']

【讨论】:

    【解决方案2】:

    首先,您的 JSON 是错误的。你只是过分的人反对。 数据结构真的很糟糕,我建议你重新考虑一下。

    假设人不会被覆盖我想出了这个解决方案。

    var array = [
                {
                    "person": {
                        "info": [
                            "age:1",
                            "age:2",
                            "age:3",
                            "age:4",
                            "age:5",
                            "age:6",
                            "gender:male"
                        ]
                    },
                    "person1": {
                        "info": [
                            "age:4",
                            "age:5",
                            "age:6",
                            "age:7",
                            "age:8",
                            "age:9",
                            "gender:male"
                        ]
                    },
                    "person2": {
                        "info": [
                            "age:8",
                            "age:9",
                            "age:10",
                            "age:11",
                            "age:12",
                            "age:13",
                            "gender:female"
                        ]
                    }
                }
            ]
    
    
            let agesArray = []
            let ages = []
            array.forEach((peopleObj) => {
                for (const index in peopleObj) {
                    ages = peopleObj[index].info.map((age) => {
                        const ageNumber = age.split(':')[1]
                        if (parseInt(ageNumber)) {
                            return ageNumber  
                        }
                    }).filter(val => !!val)
                    agesArray = [...agesArray, ...ages]
                }
            })
    

    【讨论】:

      【解决方案3】:

      非常感谢各位。我会应用你所有的想法并尝试它是否可以解决我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多