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
的赋值应该非常简单。在比较之前,您可能希望将
键转换为一个数字