React state和JSON以及arrays =>错误的结果

时间:2017-12-26 14:00:56

标签: json reactjs iteration local-storage states

编辑:所以,我找到了我最初问题的解决方案,这让我意识到我还有另一个问题。

它似乎比我想象的要容易

setNumbers(e) {
    e.preventDefault();
    var already_exists = false;
    var ls_data = this.state.storedNumbers;

    var rname = document.getElementById('name').value;
    var rnumb = document.getElementById('nummer').value;
    var ls_key = this.state.ls_key;

    for (key in ls_data) {
        if(ls_data.hasOwnProperty(key) === true) {
            if(ls_data[key].name === rname) {
                if(ls_data[key].Number === rnumb) {
                    already_exists = true;
                }
            }
        }
    }

    if(!already_exists) {
        ls_key++;
        ls_data[ls_key] = {
            name: rname,
            Number: rnumb
        };

        localStorage.setItem("ls_numbers", JSON.stringify(this.state.storedNumbers));
        localStorage.setItem("ls_key", ls_key); 

        this.setState({
            ls_key: localStorage.getItem("ls_key"),
        });

    }
}

但现在我的问题是,我不能迭代它,因为它是一个嵌套对象而不是一个数组。所以.map不起作用(this.state.storedNumbers.map不是函数)。

遗憾地将storedNumber更改为数组并不能解决问题,如

        ls_data[ls_key] = {
            name: rname,
            Number: rnumb
        };

不在数组中工作。所以现在我的问题是。我可以使用我的ls_key变量在我的数组中创建一个名称对象吗?使用上面的代码会导致:

[
    null,
    {
        "name" : "Person 1",
        "Number" : "XXXXXXXX"
    },
    {
        "name" : "Person 2",
        "Number" : "XXXXXXXX"
    }
]

虽然数组看起来像:

[
    "1": {
        "name" : "Person 1",
        "Number" : "XXXXXXXX"
    },
    "2": {
        "name" : "Person 2",
        "Number" : "XXXXXXXX"
    }
]

或者有没有办法迭代嵌套的JSON结果,就像.map对数组一样?

1 个答案:

答案 0 :(得分:0)

好吧那么,我自己想出来了:

我的数据格式不正确(初始问题)的原因,仍然是蓝色的。我已经改变了很多代码并再次恢复原始代码,瞧瞧,奇迹般地说这一切都奏效了。不能告诉你有什么区别。之后,我可以轻松简化编辑问题中显示的代码。

要迭代数据,下面的代码是我的解决方案。如果您有更清洁的解决方案,请告诉我们!

{this.state.storedNumbers.length < 1
    ?   <li className='list-group-item'><strong>Geen recente nummers...</strong><span className='pull-right'><span className='glyphicon glyphicon-warning glyph-xl'></span></span></li>
    :   Object.keys(this.state.storedNumbers).map((number) => { 
            return (
                <div className='item' key={number}>
                    <a className='list-group-item list-link'>
                        <strong>{this.state.storedNumbers[number].name}</strong> - ({this.state.storedNumbers[number].Number})
                    </a>
                    <span className='button-delete glyph-xl'>
                        <i className='glyphicon glyphicon-trash glyph-xl' aria-hidden='true'></i>
                    </span>
                </div>
            )})
}