遍历对象数组并更改内部另一个数组的外观

iterate through array of objects and change apperence of another array inside

提问人:sPohlerUs 提问时间:8/8/2023 最后编辑:Peter SeligersPohlerUs 更新时间:8/11/2023 访问量:82

问:

如何编辑对象内的数组? 我的数组包含一个字符串,但我希望通过 .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(“”) 方法?

JavaScript 数组对象 解析 映射

评论

0赞 Sudipto Bhattacharya 8/8/2023
请发布您的完整字符串值,您可以使用 'JSON.parse(text);'
0赞 mplungjan 8/8/2023
请访问帮助中心参观以查看内容和如何提问。做一些研究 - 搜索 SO 寻找答案。如果您遇到困难,请发布一个最小的可重现示例,并使用 [<>] 片段编辑器记录输入和预期输出。
0赞 mplungjan 8/8/2023
@SudiptoBhattacharya号[“A,B,C”] 不是有效的 JSON
1赞 trincot 8/8/2023
如果不是 Keyword1,而是带有逗号或双引号的东西怎么办?那会是什么样子呢?这些事情最好从源头上解决。你最初是如何获得这种结构的?

答:

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>

基准测试:

enter image description here

<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 属性以及扩展语法重新创建为部分浅拷贝。由于匹配所有分组的匹配项,还会为每个新项目分配新计算的预期数组值。keywordskeyword

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);