在javascript中更改数组对象的属性的一部分

时间:2019-03-15 01:43:05

标签: javascript arrays typescript

我有一个类似于以下对象的数组:

[
  {
    number: 1,
    name: "A"
  },
  {
    number: 2,
    name: "e",
  },
  {
    number: 3,
    name: "EE",
  }
]

我需要能够在特定位置将对象插入到数组中,但是随后我必须移动对象其余部分的所有数字,因此这些数字是按顺序排列的。 同样,我需要能够删除一个对象,但必须将所有数字移回去。

即如果我在名称为“ F”的位置1处插入,数组将变为:

[
  {
    number: 1,
    name: "A"
  },
  {
    number: 2,
    name: "F"
  },
  {
    number: 3,
    name: "e",
  },
  {
    number: 4,
    name: "EE",
  }
]

我知道有几种方法可以做到,但是没有一个看起来很漂亮。 在这里发表我的一些想法:

  1. 要插入,我做了this.arr.splice(1, 0, newObj),然后尝试遍历this.arr,对于任何大于2的索引,我都做了++ number,这很有效,但是很丑。
  2. 要插入,我做了this.arr.splice(1, 0, newObj),然后用let newArr = this.arr.split(2)拆分this.arr,然后是newArr.map(a => {...}),并使用splice用newArr替换部分原始arr。

新编辑: 在这里分享我的一些代码,这是可行的,但是我想简单地做一下,或者使其尽可能漂亮。请分享想法。

const newObj = {
  number: obj.number + 1,
  name: 'S',
}
this.arr.splice(obj.number, 0, newObj)
if (this.arr.length > obj.number) {
  const remaining = this.arr.slice(obj.number + 1).map( (t) => ({...t, ...{number: t.number + 1}}))
  this.arr.splice(newObj.number, remaining.length, ...remaining)
}

2 个答案:

答案 0 :(得分:1)

要获得预期结果,请使用splice(index,deleteCount,item)并在map中使用index分配给每个对象的编号,以在您删除之后按顺序获取编号

let arr = [
  {
    number: 1,
    name: "A"
  },
  {
    number: 2,
    name: "e",
  },
  {
    number: 3,
    name: "EE",
  }
]

let newObj = {
name: "F",
  }
arr.splice(1,0, newObj)//To add
  //  console.log(arr)

//arr.splice(2,1) //To delete
//console.log(arr);

console.log(arr.map((v,i) => {
  v.number = i;
  return v
}));

Array.splice的引用链接-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

答案 1 :(得分:0)

您可以使用...扩展语法和分片。

  • operation用于确定是否要删除或添加该值。
  • 如果operationdel,则比我们将第一个从0切到索引,然后再从index+1切到数组末尾。
  • 否则,我们将from 0 upto index切成薄片并添加所需的值,然后再将其余部分相加(from index to end
  • 最后映射值以相应地调整number属性

let arr = [{ number: 1,name: "A"},{number: 2,name: "e",  }, {number: 3,name: "EE",}]

let handleArray = (array,operation,index,value) => {
  if(operation === 'del') {
    return [...array.slice(0, index), ...array.slice(index+1,)].map((value,index)=> (value.number = index+1, value))
  } else {
    return [...array.slice(0,index),value,...array.slice(index,)].map((value,index)=> (value.number = index+1,value))
  }
}

console.log(handleArray(arr,'add',0,{a:1}))
console.log(handleArray(arr,'del',0))