提问人:sPohlerUs 提问时间:8/8/2023 最后编辑:Peter SeligersPohlerUs 更新时间:8/11/2023 访问量:82
遍历对象数组并更改内部另一个数组的外观
iterate through array of objects and change apperence of another array inside
问:
如何编辑对象内的数组? 我的数组包含一个字符串,但我希望通过 .split(“”) 或其他方法拆分字符串。 这是它目前的样子:
line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1, Keyword2, Keyword3]"] }
]
在本例中,括号是字符串的一部分。我会通过 .replaceAll() 或正则表达式删除它们,我猜? 我想说的是:
line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["Keyword1", "Keyword2", "Keyword3"] },
{"id": 2, "topic_no": 452, "keywords": ["Keyword1", "Keyword2", "Keyword3"] },
{"id": 3, "topic_no": 453, "keywords": ["Keyword1", "Keyword2", "Keyword3"] }
]
我假设我需要通过普通循环遍历line1_x并使用 .split(“”) 方法?
答:
0赞
Hao Wu
8/8/2023
#1
我提出了一个正则表达式解决方案:
(?!\s)[^\[\],]+?(?=\s*[\],])
匹配所有内容,但不匹配 ,或者不以空格开头,以 或 结尾。
,
[
]
]
,
const line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["[Hello world,Back/front end, full-stack!]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3!]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1,Keyword2, Some Keyword3 ]"] }
];
const output = line1_x.map(({ keywords, ...rest }) => ({
...rest,
keywords: keywords[0].match(/(?!\s)[^\[\],]+?(?=\s*[\],])/g)
}));
console.log(output);
评论
1赞
Alexander Nenashev
8/8/2023
未在关键字中捕获!
0赞
Hao Wu
8/8/2023
@AlexanderNenashev根据您添加的信息进行更新。
0赞
sPohlerUs
8/8/2023
感谢您的解决方案,就像一个魅力:)
0赞
Alexander Nenashev
8/8/2023
#2
修剪括号并用逗号加空格分隔。 该问题意味着就地修改数组:
line1_x.forEach(item => item.keywords = item.keywords[0].slice(1, -1).split(', '));
console.log(line1_x);
<script>
const line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["[Hello world!, Keyword2, Keyword3]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1, Keyword2, Keyword3]"] }
]
</script>
基准测试:
<script benchmark data-count="300000">
const line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["[Hello world!, Keyword2, Keyword3]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1, Keyword2, Keyword3]"] }
];
// @benchmark Peter
line1_x.map(({ keywords, ...other }) => ({
...other,
keywords: Array
.from(
keywords
.at(0)
.matchAll(/[[,]\s*(?<keyword>[^,\]]+)/g)
)
.map(({ groups: { keyword } }) => keyword.trim())
}));
// @benchmark Hao Wu
line1_x.map(({ keywords, ...rest }) => ({
...rest,
keywords: keywords[0].match(/(?!\s)[^\[\],]+?(?=\s*[\],])/g)
}));
// @benchmark Thomas
{
const line = [
{"id": 1, "topic_no": 451, "keywords": ["[Hello world!, Keyword2, Keyword3]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1, Keyword2, Keyword3]"] }
];
line.map(row => {
row.keywords = row.keywords[0].replaceAll(/[\[\]']+/g, "").split(", ");
return row;
});
}
// @benchmark Alexander
{
const line1_x = [
{"id": 1, "topic_no": 451, "keywords": ["[Hello world!, Keyword2, Keyword3]"] },
{"id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{"id": 3, "topic_no": 453, "keywords": ["[Keyword1, Keyword2, Keyword3]"] }
];
line1_x.forEach(item => item.keywords = item.keywords[0].slice(1, -1).split(', '));
line1_x;
}
</script>
<script src="https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>
评论
0赞
Thomas Zimmermann
8/8/2023
正则表达式关键字的有趣使用,也适用于基准测试,但不适用于非字母数字关键字,例如:1!2,多个关键字,例如:Hello world,以及诸如:Front/Back,全栈之类的东西\w+
0赞
Alexander Nenashev
8/8/2023
@ThomasZimmermann扔掉了正则表达式,拆分工作正常,更新了基准
0赞
Peter Seliger
8/8/2023
#3
主要任务是对 OP 对象的值进行基于正则表达式的解析。一个可能的正则表达式,如....../[[,]\s*(?<关键字>[^,\]]+)/g
...可能使用命名捕获组。keywords
然后,整个任务是映射
ping OP 的数据结构,其中每个数据项将通过解构和 rest 属性以及扩展语法重新创建为部分浅拷贝。由于匹配所有分组的匹配项,还会为每个新项目分配新计算的预期数组值。keywords
keyword
console.log(
[
{ "id": 1, "topic_no": 451, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{ "id": 2, "topic_no": 452, "keywords": ["[Keyword1, Keyword2, Keyword3]"] },
{ "id": 3, "topic_no": 453, "keywords": ["[Keyword1,Keyword2, Some Keyword3 ]"] },
]
.map(({ keywords, ...other }) => ({
...other,
keywords: Array
.from(
keywords
.at(0)
// see ... [https://regex101.com/r/CPAFnS/1]
.matchAll(/[[,]\s*(?<keyword>[^,\]]+)/g)
)
.map(({ groups: { keyword } }) => keyword.trim())
}))
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
0赞
Jerry
8/8/2023
#4
下面是工作示例:
let line1_x = [
{ id: 1, topic_no: 451, keywords: ["[Keyword1, Keyword2, Keyword3]"] },
{ id: 2, topic_no: 452, keywords: ["[Keyword1, Keyword2, Keyword3]"] },
{ id: 3, topic_no: 453, keywords: ["[Keyword1, Keyword2, Keyword3]"] },
];
let result = line1_x.map((elem) => {
let strArr = elem.keywords[0].split("");
strArr.shift();
strArr.pop();
let temp = strArr.join("").split(" ").join("").split(",");
elem.keywords = temp;
return elem;
});
console.log(result);
评论