我有一个像这样格式化的对象数组:
{
"_id": "590cbcd9bf2b9b18ab3c3112",
"title": "",
"content": "Create Notes Webapp",
"checked": true,
"listID": "590cbc61bf2b9b18ab3c3110"
},
{
"_id": "590cfe5a86fe0908c560c2b0",
"title": "A Note 01",
"content": "My first note.",
"checked": false,
"listID": "590cbe15bf2b9b18ab3c3114"
}
以下是我必须更新每个项目的代码:
onTextChange = (key, note, value) => {
clearTimeout(timeoutID);
switch (key) {
default:
break;
case 'title':
note.title = value;
break;
case 'checked':
note.checked = value;
break;
case 'content':
note.content = value;
break;
}
var notes = this.state.notes;
var id;
for (var i in notes) {
if (notes[i]._id === note._id) {
notes[i] = note;
id = i;
break;
}
}
this.setState({ notes }, () => { timeoutID = setTimeout(() => this.updateNote(this.state.notes[id]), 3000); });
}
这就是这样的:
onChange={(e, value) => this.onTextChange('title', note, value)}
有没有比使用switch语句更新对象中指定项目更好的方法?另外,是否有一种更简单的方法来扫描数组的id而不是for循环?
答案 0 :(得分:1)
有没有比使用switch语句更新对象中指定项目更好的方法?
您可以使用此语法更新注释对象。这也确保它不会在注释中插入新属性。
if (note.hasOwnProperty(key) {
note[key] = value
}
更简洁的语法更新笔记
var newNotes = this.state.notes.map(n => n._id === note._id ? note : n);
this.setState({notes: newNotes});
这将创建一个与当前状态相同的newNotes数组,除了它将替换传入的._id等于数组中的那个。
您还必须调整updateNote调用,因为您不再保存索引,但您可能只是使用note变量?
答案 1 :(得分:1)
而不是切换你可以这样做,但你必须检查它是否存在于对象中。
onTextChange = (key, note, value) => {
clearTimeout(timeoutID);
if(note[key]){
note[key] = value;
}
var notes = this.state.notes;
var id;
}
至于循环,大多数标准如airbnb和google都是首选。 如果你想要一个更好的方法,你可以根据情况对这些对象做几件事情,如果你使用es5,es6,但你的选择是: 1.将对象数组放入一个对象(属性名称)作为您的id(它们可以是任何字符串)。 2.如果使用es6,你可以转换成地图,它可以让它变得更轻,更快,以获得所需的对象。
希望有所帮助。答案 2 :(得分:1)
正如noveyak所说,您可以使用括号语法访问Javascript中的属性,其中键是包含属性名称的字符串(就像您现在拥有的那样)。
Javascript有几种不同的访问对象属性的方法:
note[key] = value;
// if key is 'title', it will be the same as:
note.title = value;
// also the same as:
note['title'] = value;
对于第二个问题,您可以将这些对象存储在另一个对象中,而不是循环遍历数组,并将id作为属性值(基本上将其用作映射)。这样您就可以通过id直接访问注释条目。例如:
allNotes = {}; // create a new object
someNotes = {
'title': '',
'content': 'Create Notes Webapp',
'checked': true,
'listID': '590cbc61bf2b9b18ab3c3110'
};
allNotes[idOfNote] = someNote; // where idOfNote holds the actual id of the note as a string
您可以在Mozilla的参考网站here上阅读有关Javascript属性访问者的更多信息。
Javascript还有适当的地图,您可以使用而不是对象,如果您被允许使用ES2015,则更安全,更快捷。您可以了解它here(也是Mozilla文档)。