如何重命名对象 属性 值从列表中删除特定对象
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)
我有一个对象列表
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)