javascript Node.js for循环不会导致所有匹配项的拼接

tv6aics1  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(113)

我试图在一个对象内的数组中拼接parcel的所有匹配项。
名为documents的对象数组的示例:

[
{name: "first", content: ["1", "2", "1", "3"]},
{name: "second", content: ["2", "1", "1", "1"]},
{name: "third", content: ["4", "1", "3", "2"]},
]

parcel = 1,并尝试接合1的所有实体。
这是我目前掌握的情况:

console.log(parcel);
const parcel = 1;
console.log("doc start", documents);
for (i of documents) {
    // get index by count
    let count = -1;
    for (j of i.content) {
      count = count + 1;
      console.log(j);
      if (j == parcel) {
        i.content.splice(count, 1);
      }
    }
  }
console.log("doc end", documents);

以下是控制台记录的不同阵列示例:

parcel 1
doc start [
  {
    title: '1',
    content: [
      '1', '2', '2',
      '3', '1', '1',
      '2', '3'
    ]
  }
]
1
2
3
1
2
3
doc end [ { title: '1', content: [ '2', '2', '3', '1', '2', '3' ] } ]

您可以看到,j似乎并没有遍历整个i.content,这意味着if语句没有运行来拼接所有正确的项。
控制台日志的最终结果应该是:

doc start [{title: '1', content: [ '2', '2', '3', '2', '3' ]}]

我不知道为什么会这样...

mcdcgff0

mcdcgff01#

mapfilter的工作原理如下:对于迭代中的每个对象,使用spread syntax创建一个新对象,并通过从现有数组中过滤掉所有1创建一个新的内容数组。

const data=[{name:"first",content:["1","2","1","3"]},{name:"second",content:["2","1","1","1"]},{name:"third",content:["4","1","3","2"]}];

const out = data.map(obj => {
  return {
    ...obj,
    content: obj.content.filter(n => Number(n) !== 1)
  };
});

console.log(out);
carvr3hs

carvr3hs2#

由于您只想按内容过滤,因此应使用mapfilter内置数组方法

const parcel = 1

const result = [
    {name: "first", content: ["1", "2", "1", "3"]},
    {name: "second", content: ["2", "1", "1", "1"]},
    {name: "third", content: ["4", "1", "3", "2"]},
    ].map(item =>({...item, content:item.content.filter(amount => Number(amount) !== parcel)}))

相关问题