如何重命名对象 属性 值从列表中删除特定对象

How to rename an object property values removing a specific object from the list

我有一个对象列表

let table = [{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]

我想在从列表中删除具有特定 id 值的对象后重命名 id 值(例如 id:5)

我正在使用数组过滤方法

table.filter((element,index)=>{
    if(element.id!==5){
        element.id=index
        return element 
    }else{
       index+1
    }
    return null
})

我期待 return 值

[{id: 0,val: "21321"},{id: 1,val: "345345"}]

但我明白了

[{id: 0, val: "21321"},{id: 2, val: "345345"}]

注意:我知道我可以使用 filter 方法删除特定对象,而不是使用 map 方法重命名 id 值,但我想要一个只需要使用一个箭头函数的解决方案

这样就可以了:

let table = [[{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]];

let res=table[0].reduce((a,c)=>{if(c.id!=5){
    c.id=a.length;
    a.push(c)
  }
  return a}, []);
  
console.log([res])

使用“单箭头函数”的唯一方法是使用 .reduce()

这是一个极短的(单行)版本:

let res=table[0].reduce((a,c)=>(c.id!=5 && a.push(c.id=a.length,c),a),[]);

实际上,我对“唯一可能的解决方案”的评论有点过早。这是使用 .filter() 结合 IIFE(“立即调用的函数表达式”)的方法的修改版本:

table = [[{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]];

res= [ (i=>table[0].filter((element,index)=>{
    if(element.id!==5){
        element.id=i++
        return element 
    } }))(0) ];
    
console.log(res)

这个 IIFE 是在不污染全局名称 space 的情况下引入持久局部变量 i 的简单方法。但是,严格来说,这样做我引入了第二个“箭头函数”...

您可以使用 array#reduce 更新索引并删除具有给定 ID 的元素。对于匹配的 id 元素,只需 return 累加器,对于其他元素,使用 val 添加新对象并更新 id.

const data = [{ id: 4, val: "21321" }, { id: 5, val: "435345" }, { id: 6, val: "345345" }],
      result = data.reduce((res, {id, val}) => {
        if(id === 5) {
          return res;
        }
        res.push({id: res.length + 1, val});
        return res;
      }, []);
console.log(result)

使用过滤器并同时更改对象可能不是最佳做法。但是您需要在过滤时跟踪计数。

let table = [[{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]]

const removeReorder = (data, id) => {
  var count = 0;
  return data.filter(obj => {
    if (obj.id !== id) {
      obj.id = count++;
      return true;
    }
    return false;
  });
}

console.log(removeReorder(table[0], 5));

使用reduce方法可以达到预期效果:

const result = table.reduce((a, c) => {
    let nestedArray = [];
    c.forEach(el => {
        if (el.id != id)
            nestedArray.push({ id: nestedArray.length, val: el.val });
    });
    a.push(nestedArray);
    return a;
}, [])

一个例子:

let table = [[{ id: 4, val: "21321" }, { id: 5, val: "435345" }, { id: 6, val: "345345" }]]
let id = 5;

const result = table.reduce((a, c) => {
    let nestedArray = [];
    c.forEach(el => {
        if (el.id != id)
            nestedArray.push({ id: nestedArray.length, val: el.val });
    });
    a.push(nestedArray);
    return a;
}, [])

console.log(result);

代码中的主要问题是 filter 方法未返回布尔值。使用 filter 方法筛选项目,然后使用 map 更改对象。

let table = [
  [
    { id: 4, val: "21321" },
    { id: 5, val: "435345" },
    { id: 6, val: "345345" },
  ],
];

const res = table[0]
  .filter(({ id }) => id !== 5)
  .map(({ val }, i) => ({ id: i, val }));
  
  
console.log(res)

或者,使用 forEach 一次迭代

let table = [[{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]]

const res = []; 
let i = 0;
table[0].forEach(({id, val}) => id !== 5 && res.push({id: i++, val}));

console.log(res)