创建新对象(如果不存在),否则更新



我在处理对象和将它们存储为JSON时遇到了一些麻烦。

我想做的是下一步:

  1. 解析json文件
var links = JSON.parse([{"user1":{"username":"user1","data":"164"}},{"user2":{"username":"user2","status":0}}]);
  1. 如果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属性,因为如果不存在,它只会创建它,如果存在,它会覆盖中存储的内容

最新更新