在数组内移动对象Javascript

问题描述

我有一个类似这样的对象数组

arr = [{"class":"section"},{"fieldGroup":[]},{"class":"col","name":"input"},"name":"dropdown"},"name":"date"},"name":"table"}]

现在我需要用 "class":"col" 移动包含 "fieldGroup" 的前一个对象内的对象

所以我想要的输出应该是这样的

arr = [{"class":"section"},{"fieldGroup":[{"class":"col","name":"date"}]},"name":"table"}]}]

我试过这段代码

arr.forEach((item: any,index: number) => {
    if (item.class === "col") {
            arr[index - 1].fieldGroup.push(item);
            arr.splice(index,1);
    }else {
        return arr;
    }
})

但收到错误提示 cannot read property push of undefined

有什么帮助吗?

解决方法

您的问题是,当您使用 .splice() 从数组中删除一项时,您 arr 中的所有项都会向下移动一个索引。例如,曾经位于索引 3 的项目现在位于索引 2,曾经位于索引 4 的项目现在位于索引 {{1} } 等。您的 3 循环没有考虑到这种转变,因此一旦您使用 .forEach() 删除索引 2 处的项目,您的 .splice() 更改为 {{1 }} 进行下一次迭代,但实际上,您需要再次查看索引 index,因为您的数组项已经向下移动了一个索引。您可以通过使用标准 3 循环并在删除项目以再次查看 th 时递减索引计数器来解决此问题:

2

,
var a = [
  { class: "section" },{ fieldGroup: [] },{ class: "col",name: "input" },{ class: "dropdown" },{ class: "date" },name: "table" },];

var res = [];
var currFieldGroup = null;
for (var i in a) {
  if ("fieldGroup" in a[i]) {
    currFieldGroup = a[i];
    res.push(a[i]);
  } else if ("class" in a[i]) {
    if (currFieldGroup) {
      currFieldGroup.fieldGroup.push(a[i]);
    } else {
      res.push(a[i]);
    }
  }
}
console.log(res);
,

试试...

git push origin main
,

试试这个:

var arr = [{
    "class": "section"
  },{
    "fieldGroup": []
  },{
    "class": "col","name": "input"
  },{
    "class": "dropdown"
  },{
    "class": "date"
  },"name": "table"
  }
];

let fieldGroupPosition;
let finalArr = [];
let lastGroupPosition = null;

arr.forEach((item,index) => {
  if (Array.isArray(item.fieldGroup)) {
    finalArr.push({
      fieldGroup: []
    });
    lastGroupPosition = finalArr.length - 1;
  } else {
    if (lastGroupPosition)
      finalArr[lastGroupPosition].fieldGroup.push(item);
    else
      finalArr.push(item);
  }
});

console.log(finalArr);