Javascript 使用关键点删除对象对象中的关键点,并减少后续对象的关键点
这很难用语言来解释,所以让我告诉你我得到了什么,然后从那里开始工作 我的目标如下:Javascript 使用关键点删除对象对象中的关键点,并减少后续对象的关键点,javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,这很难用语言来解释,所以让我告诉你我得到了什么,然后从那里开始工作 我的目标如下: { 1: { name: 'Initial Step 1', stepNumber: 1 }, 2: { name: 'Initial Step 2', stepNumber: 2 }, 3: { name: 'Initial Step 3', stepNumber: 3 }, 4: { name: 'Initial Step 4', stepNumber: 4 }, } 我想为这一步执行删除功
{
1: { name: 'Initial Step 1', stepNumber: 1 },
2: { name: 'Initial Step 2', stepNumber: 2 },
3: { name: 'Initial Step 3', stepNumber: 3 },
4: { name: 'Initial Step 4', stepNumber: 4 },
}
我想为这一步执行删除功能,然后删除尾随键,以便得到以下结果:
{
1: { name: 'Initial Step 1', stepNumber: 1 },
2: { name: 'Initial Step 3', stepNumber: 2 },
3: { name: 'Initial Step 4', stepNumber: 3 },
};
我只是不确定实现我的deleteStep
功能的最佳方法
我已将其实现如下:
export const deleteStep = (stepNumber, steps) => {
// What should I do here?
return steps;
};
谢谢 您可以删除实际键并检查是否存在更多键,然后创建新属性并删除旧引用
函数deleteAndShift(对象、键){
删除对象[键];
while(++键入对象){
对象[键]。步骤编号--;
对象[键-1]=对象[键];
删除对象[键];
}
}
var object={1:{name:'初始步骤1',步骤编号:1},2:{name:'初始步骤2',步骤编号:2},3:{name:'初始步骤3',步骤编号:3},4:{name:'初始步骤4',步骤编号:4};
deleteAndShift(对象,2);
console.log(对象)代码>
.as console wrapper{max height:100%!important;top:0;}
如果可以/想要返回新对象,可以执行以下操作:
const deleteStep=(步骤编号,步骤)=>{
const result={};
Object.key(步骤).forEach(key=>{
键=数字(键);
如果(键<步数){
//保留前面的条目
结果[键]=步骤[键];
}否则如果(键>步数){
//转移下列条目
结果[key-1]=steps[key];//或使用`Object.assign({},steps[key])的浅层复制`
结果[键-1]。步骤编号--;
}
});
返回结果;
};
常数步长={
1:{name:'初始步骤1',步骤编号:1},
2:{name:'初始步骤2',步骤编号:2},
3:{name:'初始步骤3',步骤编号:3},
4:{name:'初始步骤4',步骤编号:4},
};
日志(删除步骤(3,步骤))代码>您可以按照不可变的路线创建一个新对象,如下所示:
函数省略步骤(步骤,步骤编号){
返回对象。键(步骤)。减少(功能(acc,键){
var keyNum=数字(键);
如果(keyNumstepNumber){
acc[keyNum-1]=步数[key];
}
返回acc;
}, {});
}
var newSteps=省略步骤({
1:{name:'初始步骤1',步骤编号:1},
2:{name:'初始步骤2',步骤编号:2},
3:{name:'初始步骤3',步骤编号:3},
4:{name:'初始步骤4',步骤编号:4},
}, 3);
console.log(新闻步骤)代码>一种可能的解决方案是使用
reduce
的优点是返回一个新对象,而旧对象没有被修改
const removeStep=(步骤,步骤编号)=>{
return Object.keys(steps).reduce((newSteps,current)=>{
const numberOfNewStep=Object.keys(newSteps).length+1
返回编号(当前)==步骤编号
?新闻步骤
:Object.assign(
{},
新闻步骤,
{[numberOfNewStep]:Object.assign(
{},
步骤[当前],
{步骤编号:numberOfNewStep}
)
}
)
}, {})
}
console.log(removeStep({
1:{name:'初始步骤1',步骤编号:1},
2:{name:'初始步骤2',步骤编号:2},
3:{name:'初始步骤3',步骤编号:3},
4:{name:'初始步骤4',步骤编号:4},
},1))
这是API中预先存在的数据结构。“我应该在这里做什么?”获取所有键的列表,对它们进行排序,保留比要删除的键大的键,并将每个键的值重新分配给键-1
,删除最大键。或者创建一个分配给新对象。“这是API中预先存在的数据结构。”因此,如果您愿意,可以将其转换为数组。我已经更新了我的问题。有一些东西需要考虑。while(输入对象)
。哇!乍一看肯定是语法错误:-)我建议添加一条注释,或者使用for(;key-in-object;key++)
改为循环。我编辑了您答案的对象
变量以匹配我的问题输入,它不会像我需要的那样重置每个关键对象内的步骤号。@BarryMichaelDoyle请不要编辑您的问题以包含新的要求。另一方面,在将对象移动到新的键时,添加一个改变.stepNumber
的赋值应该非常简单。在比较之前,您可能希望将键转换为一个数字