繁体   English   中英

从数组中删除一个对象然后更新所有对象的属性

[英]Remove an object from the array then update the property of all objects

我想通过 id 从数组中删除一个对象,然后更新所有对象的位置属性。 例如我有一个数组,如:

const arr = [
  {id: 10, position: 1},
  {id: 11, position: 2},
  {id: 12, position: 3},
  {id: 13, position: 4}
]

示例:首先,我需要删除 id 为 12 的对象,然后更改每个对象的位置属性。 结果:

const arr = [
  {id: 10, position: 1},
  {id: 11, position: 2},
  {id: 13, position: 3}
]

我的尝试:

const fn = id => pipe(
  reject(propEq('id', id)),
  map((item, key) => evolve({position: key}))
);

通过将R.addIndex应用于R.map创建一个mapIndexed函数。 这是必需的,因为R.map不会将当前索引传递给回调函数。

此外,您需要向R.evolve传递一个函数来设置position (通过R.always或箭头函数),并且您还需要传递item以进行进化:

 const { pipe, reject, propEq, addIndex, map, evolve, always } = R; const mapIndexed = addIndex(map); const fn = id => pipe( reject(propEq('id', id)), mapIndexed((item, key) => evolve({ position: always(key + 1) }, item)) ); const arr = [{"id":10,"position":1},{"id":11,"position":2},{"id":12,"position":3},{"id":13,"position":4}]; const result = fn(11)(arr); console.log(result);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

在这种情况下,我会跳过R.evolve ,并在item上使用 spread 来生成新对象,并分配新position

 const { pipe, reject, propEq, addIndex, map } = R; const mapIndexed = addIndex(map); const fn = id => pipe( reject(propEq('id', id)), mapIndexed((item, key) => ({ ...item, position: key + 1 })) ); const arr = [{"id":10,"position":1},{"id":11,"position":2},{"id":12,"position":3},{"id":13,"position":4}]; const result = fn(11)(arr); console.log(result);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

您可以使用Array.filter()删除和Array.map()重新定位项目,如下所示:

 const arr = [ {id: 10, position: 1}, {id: 11, position: 2}, {id: 12, position: 3}, {id: 13, position: 4} ] repositionedArray = arr.filter(item => item.id != 11).map((item, index) => ({...item, position: index+1})) console.log(repositionedArray);

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM