【问题标题】:How to restart the numeration of the keys in a object?如何重新开始计算对象中的键?
【发布时间】:2021-06-09 11:32:41
【问题描述】:

有什么问题:

这是我存储在this.state.jsondata 中的数据:

{
  label{0:1,1:1}
  prediction{0:0,1:1}
  text{0:"abc",1:"def"}
}

这是前面JSON.stringify(this.state.jsondata)

{"label":{"1":0,"2":0,"3":0,"4":0},"text":{"1":"aa","2":"bb,"3":"cc","4":"dd"},"prediction":{"1":2,"2":2,"3":2,"4":2}}

当我使用此代码删除一个元素时:

    removeData = (keyToRemove) => {
        // create a deep copy of the object
        const clonedJsonData = JSON.parse(JSON.stringify(this.state.jsondata))
        // now mutate this cloned object directly
        Object.keys(clonedJsonData).forEach(key => delete clonedJsonData[key][keyToRemove])
        // set the state
        this.state.jsondata = clonedJsonData

this.state.jsondata 变为:

{
  label{1:1}
  prediction{1:1}
  text{1:"def"}
}

而不是像这样从 0 开始:

{
 label{0:1}
 prediction{0:1}
 text{0:"def"}
}

所以基本上我想将key 设置回“0, 1, 2, 3..”

我尝试了什么:

我试图遍历我的数据,但我循环遍历它的方式有问题:

    removeData = (keyToRemove) => {
        // create a deep copy of the object
        const clonedJsonData = JSON.parse(JSON.stringify(this.state.jsondata))
        // now mutate this cloned object directly
        Object.keys(clonedJsonData).forEach(key => delete clonedJsonData[key][keyToRemove])
        // reset keys value
        let i = 0
        Object.keys(clonedJsonData).forEach(function(key) {
            Object.keys(clonedJsonData[key]).forEach(function(k) {
                var newkey = i++;
                clonedJsonData[key][k] = clonedJsonData[key][k];
                delete clonedJsonData[key][k];
            })
        })
        // set the state
        this.state.jsondata = clonedJsonData
        
    }

预期的输出是什么?

预期的输出是:

{
 label{0:1}
 prediction{0:1}
 text{0:"def"}
}

【问题讨论】:

  • @evolutionxbox 我不这么认为
  • 您存储的不是 JSON。请展示真实的数据/对象。
  • @Teemu 这是我的数据imgur.com/a/epMQCfe
  • 预期的输出看起来无效?
  • 将其作为文本添加到帖子中......问题来了,对象的键不像数组索引那样“自动索引”,因为键始终是字符串。

标签: javascript arrays json object key


【解决方案1】:

如果你的键基本上代表值的索引,为什么不使用数组呢? { 标签:[1,1],预测:[0,1],文本:["abc","def"] }

如果您现在删除每个数组中的第一个条目,data.text[0] 将是“def”等等...

编辑:

如果您不想转换数据,则必须小心,尤其是当您解析和字符串化整个内容然后循环遍历键时。之后它们不必处于相同的顺序。

除了克隆对象,删除要删除的键,然后更新所有键之外,您还可以手动复制对象并留下要删除的键

var data = {label: {0:0, 1:0}, prediction: {0:0, 1:1}, text: {0:'abc',1:'def'}};
console.log("Original Data");
console.log(data);

removeData = (data, keyToRemove) => {
    var ret = {};
    Object.keys(data).forEach(key=>{
        ret[key] = {};
        let idx = 0;
    
        for (let dataIdx = 0; dataIdx < Object.keys(data[key]).length; dataIdx++) {
            if (dataIdx.toString() !== keyToRemove) {
                ret[key][idx.toString()] = data[key][dataIdx.toString()];
                idx++;
          }
        }
    }); 
  
  return ret;
}

var reducedData = removeData(data,"0");
console.log("Reduced Data");
console.log(reducedData);

请注意,我不会遍历键,因此不会混淆顺序。 请注意,我还通过将数据对象作为参数移交给原始函数来消除副作用。

【讨论】:

  • 我不想转换它
【解决方案2】:

我就是这样弄的

    removeData = (keyToRemove) => {
        // create a deep copy of the object
        const clonedJsonData = JSON.parse(JSON.stringify(this.state.jsondata))
        // now mutate this cloned object directly
        Object.keys(clonedJsonData).forEach(key => delete clonedJsonData[key][keyToRemove])
        // reset keys value 
        let i = 0
        Object.keys(clonedJsonData).forEach(function eachKey(key) {
            i = 0
            Object.keys(clonedJsonData[key]).forEach(function eachKey(kkey) {
                var newkey = i++;
                clonedJsonData[key][newkey] = clonedJsonData[key][kkey];
                
            });
            delete clonedJsonData[key][i];
        });
        
        // set the state
        this.state.jsondata = clonedJsonData
}  

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2019-01-12
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多