寻求有关如何从特定数组中获取所有过滤列表的帮助
Posted
技术标签:
【中文标题】寻求有关如何从特定数组中获取所有过滤列表的帮助【英文标题】: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:4
、age:5
。现在您再次寻找包含age:
的第一个元素……当然,仍然是age:4
。
你是对的。我的问题的原因是 find()。我用 filter() 替换了它,它现在可以工作了。谢谢
【参考方案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】:非常感谢各位。我会应用你所有的想法并尝试它是否可以解决我的问题。
【讨论】:
以上是关于寻求有关如何从特定数组中获取所有过滤列表的帮助的主要内容,如果未能解决你的问题,请参考以下文章
如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?