我在处理对象和将它们存储为JSON时遇到了一些麻烦。
我想做的是下一步:
- 解析json文件
var links = JSON.parse([{"user1":{"username":"user1","data":"164"}},{"user2":{"username":"user2","status":0}}]);
- 如果user1存在,用新数据更新整个对象,ELSE创建新对象
var key = dater['username']; //dynamic username strings
var ACCOUNT = {
username: key,
data: value,
status:1
}
if(links.hasOwnProperty(key)){
links[key] = ACCOUNT;
links=JSON.stringify(links);
fs.writeFile('status.json', links, err => {
// error checking
if(err) throw err;
console.log('Exists.. updating.');
});
}else{ // ELSE create new entry
links.push({[key]: ACCOUNT});
newData= JSON.stringify(links);
fs.writeFile('status.json', newData, err => {
// error checking
if(err) throw err;
console.log('New user.. creating');
});
}
正如你可能知道的,上面的并没有像我希望的那样工作。我习惯于PHP数组,在那里我只需要用键做数组,然后直接更新它们,而不需要任何"if/else">
const key = dater['username']; //dynamic username strings
const account = {
username: key,
data: value,
status: 1,
};
const matchedItem = links.find((i) => i[key]);
if (matchedItem) {
matchedItem[key] = account;
} else {
links.push({ [key]: account });
}
console.log('links:::', links);
fs.writeFile('status.json', JSON.stringify(links), (err) => {
if (err) throw err;
console.log('New user.. creating');
});
首先,您对JSON.parse
的使用是不正确的,因为它的目的是获取JSON格式的字符串,并将其解析为JS对象(或其中编码的任何其他实体(。您向它传递了一个数组,由于JS具有非常预期和直观的行为,它试图将其转换为一个字符串,最终为[Object object]
,这应该会导致错误。
我想这只是一个拼写错误,而你忘记了"在阵列之前和之后。
第二,links
是一个数组。当您在此数组上使用hasOwnProperty
时,您询问的是数组本身是否具有此键,而不是其成员之一是否具有。
有两种选择:
任一
您可以使用some
函数在数组上循环,并检查数组中的某个对象是否具有如下键:
const isUserAlreadyExists = links.some(userObj => userObj.hasOwnProperty(key))
并将此作为您的条件
或
重塑您的数据,使其成为一个以用户名为密钥的对象,类似于:
{
user1: {username: "user1", data: whatever},
user2: {username: "user2", data: whatever}
...
}
然后您当前的解决方案应该会起作用。我建议第二种解决方案,因为你的数据模型看起来有点奇怪,也许可以考虑完全不同的数据结构。
要做到这一点,您的初始数据必须是一个空对象(const links = {}
或从任何地方获取(
然后你可以把这个部分保留在if
子句中,它应该可以工作
所以你的代码应该是这样的:
var key = dater['username']; //dynamic username strings
var ACCOUNT = {
username: key,
data: value,
status:1
}
links[key] = ACCOUNT;
links=JSON.stringify(links);
fs.writeFile('status.json', links, err => {
// error checking
if(err) throw err;
console.log('Exists.. updating.');
});
这样,你就不必检查对象中是否存在key
属性,因为如果不存在,它只会创建它,如果存在,它会覆盖中存储的内容