我有一个常量teams
。我想把这个array
分成两个array
。第一支队伍应该是名字的第一个字符中没有数字的队伍,第二支队伍应该在队伍的第一个字母中有数字。
const [teams, setTeam] = useState([]);
const teams = [{id: 1, name: "1-First"},
{id: 2, name: "Winner"},
{id: 3, name: "2-Second"}]
// teamsWithNumber
var myArray = teams.filter(function (obj) {
return obj.name.match('/^[A-Z0-9]/i')
});
const teamsWithNumber = myArray;
// teamsWithOUTNumber
var myArray = teams.filter(function (obj) {
return obj.name!== obj.name.match('/^[A-Z0-9]/i')
});
const teamsWithOUTNumber = myArray;
我的输出是
// console.log(teamsWithOUTNumber)
[OUT] []
我想要的输出
teamsWithOUTNumber = [id: 2, name: "Winner"}]
teamsWithNumber = [{id: 1, name: "1-First"},
{id: 3, "2-Second"}]
你能试试这个吗?我更改了筛选器返回值。
const [teams, setTeam] = useState([]);
const teams = [{id: 1, name: "1-First"},
{id: 2, name: "Winner"},
{id: 3, name: "2-Second"}]
// teamsWithNumber
var myArray = teams.filter(function (obj) {
return !/^[-]?d+$/.test(obj.name[0]);
});
const teamsWithNumber = myArray;
// teamsWithOUTNumber
var myArray = teams.filter(function (obj) {
return !/^[-]?d+$/.test(obj.name[0]);
});
const teamsWithOUTNumber = myArray;
您对RegExp的理解似乎有一些根本性的缺陷-您可能会发现使用Regex101这样的实用程序来帮助以更简单的英语解释您的模式的作用是很有帮助的。对于您在上面提供的工具,该工具特别指出:
^
在一行的开头断言位置- 匹配
[A-Z0-9]
下面列表中的单个字符
A-Z
匹配A
(索引65
)和Z
(索引90
)之间范围内的单个字符(区分大小写)0-9
匹配0
(索引48
)和9
(索引57
)之间范围内的单个字符(区分大小写)
由于您选择将RegExp文本用引号括起来,您还无意中包含了/
字符,您正在测试的数据中都不包含这些字符。因此,obj.name
中的两种数据模式每次都不会与此模式匹配(无论是否使用前导数字连字符组合),从而产生您所看到的结果。
相反,调整模式以准确地表达您期望过滤到每个数组中的内容。我在下面提供了/^d-/
,它明确地匹配以前导数字开头、后跟连字符的字符串。这应该更符合你想要的。
顺便说一句,由于在这种情况下您不想提取任何数据,因此您也应该选择RegExp.test()
而不是String.match()
。
最后,通过在同一个原始数组上运行filter
并将结果存储到两个独立的变量中,您可以使代码更简洁地满足和的要求-一个操作用于过滤符合模式^d-
(teamsWithNumber
)的代码,另一个操作不符合(teamsWithOUTNumber
)的代码:
const teams = [{
id: 1,
name: "1-First"
},
{
id: 2,
name: "Winner"
},
{
id: 3,
name: "2-Second"
}
]
const teamsWithNumber = teams.filter(obj => /^d-/.test(obj.name));
const teamsWithOUTNumber = teams.filter(obj => /^(?!d-)/.test(obj.name));
console.log(teamsWithNumber, teamsWithOUTNumber);
.match('/^[A-Z0-9]/i')
将不起作用,RegExp
文字是一个字符串:使用.match(/^[A-Z0-9]/i)
。
实际上,您只需要测试/^d/
(要测试的字符串的第一个字符是数字)。检查RegExp@MDN。
你可以使用这种测试的减速器,比如
const teams = [{
id: 1,
name: "1-First"
},
{
id: 2,
name: "Winner"
},
{
id: 3,
name: "2-Second"
}
];
const [numbered, notNumbered] = teams
.reduce(([t1, t2], val) =>
[...[t1, t2], /^d/.test(val.name) ? t1.push(val) : t2.push(val)], [ [], [] ]);
console.log(`with number: ${
JSON.stringify(numbered)}, nno number: ${
JSON.stringify(notNumbered)}`);