Javascript 查找并替换Json文件中的项
我正在尝试更新Express应用程序中JSON文件中存储的项目。基本上,我正在读取JSON文件的内容,更新Id获取的项,并将更新的项写入文件。问题是? 它附加了更新的项目,所以我得到了一个副本。我看不出错误在哪里 posts.json:Javascript 查找并替换Json文件中的项,javascript,arrays,json,node.js,express,Javascript,Arrays,Json,Node.js,Express,我正在尝试更新Express应用程序中JSON文件中存储的项目。基本上,我正在读取JSON文件的内容,更新Id获取的项,并将更新的项写入文件。问题是? 它附加了更新的项目,所以我得到了一个副本。我看不出错误在哪里 posts.json: [ { "name": "first name", "description": "test first description", "slug": "first-name", "id":
[
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name",
"description": "test second description",
"slug": "second-name",
"id": "0071b034"
}
]
var express = require('express');
var Creatordb = require('./database/posts.json');
var fs = require('fs');
var uuid = require('node-uuid');
var _ = require('lodash');
//Create The Item
var add = function (item) {
var id = uuid.v4();
item.id = id;
Creatordb[item.id] = item;
var outputFilename = './database/posts.json';
function appendObject(obj){
var configFile = fs.readFileSync(outputFilename);
var config = JSON.parse(configFile);
config.push(obj);
var configJSON = JSON.stringify(config, null, 4);
fs.writeFileSync(outputFilename, configJSON);
}
appendObject(item);
};
//Get The Item by Id
var getById = function (id) {
for(var i=0;i<Creatordb.length;i++) {
var id = Creatordb[i].id;
}
return id;
};
//Update The Item
var update = function (item) {
var outputFilename = './database/posts.json';
var configFile = fs.readFileSync(outputFilename);
var config = JSON.parse(configFile);
//using lodash??
var index = _.indexOf(config, _.find(config, item));
config.splice(index, 1, item);
var configJSON = JSON.stringify(config, null, 4);
fs.writeFileSync(outputFilename, configJSON);
};
创建更新删除.js:
[
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name",
"description": "test second description",
"slug": "second-name",
"id": "0071b034"
}
]
var express = require('express');
var Creatordb = require('./database/posts.json');
var fs = require('fs');
var uuid = require('node-uuid');
var _ = require('lodash');
//Create The Item
var add = function (item) {
var id = uuid.v4();
item.id = id;
Creatordb[item.id] = item;
var outputFilename = './database/posts.json';
function appendObject(obj){
var configFile = fs.readFileSync(outputFilename);
var config = JSON.parse(configFile);
config.push(obj);
var configJSON = JSON.stringify(config, null, 4);
fs.writeFileSync(outputFilename, configJSON);
}
appendObject(item);
};
//Get The Item by Id
var getById = function (id) {
for(var i=0;i<Creatordb.length;i++) {
var id = Creatordb[i].id;
}
return id;
};
//Update The Item
var update = function (item) {
var outputFilename = './database/posts.json';
var configFile = fs.readFileSync(outputFilename);
var config = JSON.parse(configFile);
//using lodash??
var index = _.indexOf(config, _.find(config, item));
config.splice(index, 1, item);
var configJSON = JSON.stringify(config, null, 4);
fs.writeFileSync(outputFilename, configJSON);
};
现在有了lodash,更新项目中的Id就消失了?
谁能解释一下吗谢谢有两个问题:
push
将新项目插入列表,这就是“重复”的原因config[item.id]=item代码>不是有效的引用。您的配置不是这样的:
[
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name edited",
"description": "test second description edited",
"slug": "second-name-edited",
//this id disappeared "id": "0071b034"//
}
]
[“0071b034”:{名称:“Foo”}]
item.id
我建议使用。有很多有用的函数,但如果坚持使用此实现,请使用以下方法:
function findIndex(collection, id) {
for(var i=0; i<collection.length; i++) {
if (collection[i].id === id) {
return i;
}
}
}
// In your update function
var index = findIndex(config, item.id);
config[index] = item;
函数findIndex(集合,id){
对于(var i=0;i有两个问题:
您使用push
将新项目插入列表,这就是“重复”的原因
config[item.id]=item;
不是有效的引用。您的配置不是这样的:
[
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name edited",
"description": "test second description edited",
"slug": "second-name-edited",
//this id disappeared "id": "0071b034"//
}
]
[“0071b034”:{名称:“Foo”}]
因此,config中的键是0,1,2,而不是item.id
我建议使用。有很多有用的函数,但如果坚持使用此实现,请使用以下方法:
function findIndex(collection, id) {
for(var i=0; i<collection.length; i++) {
if (collection[i].id === id) {
return i;
}
}
}
// In your update function
var index = findIndex(config, item.id);
config[index] = item;
函数findIndex(集合,id){
对于(var i=0;i我不明白,为什么要在update
中使用splice
函数?在JavaScript中,当处理对象或数组时,您使用的是它们的引用,而不是副本。因此,您可以使用此函数替换splice
:
var obj = _.find(config, ['id', item.id]);
_.assign(obj, item);
在这种情况下,您不必在意项是否具有所有必需的字段,因为assign
方法将只更新指定的字段
同时,如果您100%确定新项目将始终指定所有字段,那么Festo的解决方案更好,因为它只是在新项目上替换旧项目的引用,速度更快
var配置=[
{
“姓名”:“名字”,
“描述”:“测试第一描述”,
“鼻涕虫”:“名字”,
“id”:“2f065d59”
},
{
“名称”:“第二个名称”,
“描述”:“测试第二描述”,
“鼻涕虫”:“第二个名字”,
“id”:“0071b034”
}
];
功能更新(项目){
//您的读取文件逻辑。
var obj=u2;.find(配置,['id',item.id]);
_.分配(obj,项目);
//您的写入文件逻辑。
}
log('config befor update:',config);
更新({
“姓名”:“第三姓名”,
“id”:“0071b034”
});
log('config after update:',config);
我不明白,为什么要在更新中使用splice
函数?在JavaScript中,当处理对象或数组时,您使用的是它们的引用,而不是副本。因此,您可以使用此函数替换splice
:
var obj = _.find(config, ['id', item.id]);
_.assign(obj, item);
在这种情况下,您不必在意项是否具有所有必需的字段,因为assign
方法将只更新指定的字段
同时,如果您100%确定新项目将始终指定所有字段,那么Festo的解决方案更好,因为它只是在新项目上替换旧项目的引用,速度更快
var配置=[
{
“姓名”:“名字”,
“描述”:“测试第一描述”,
“鼻涕虫”:“名字”,
“id”:“2f065d59”
},
{
“名称”:“第二个名称”,
“描述”:“测试第二描述”,
“鼻涕虫”:“第二个名字”,
“id”:“0071b034”
}
];
功能更新(项目){
//您的读取文件逻辑。
var obj=u2;.find(配置,['id',item.id]);
_.分配(obj,项目);
//您的写入文件逻辑。
}
log('config befor update:',config);
更新({
“姓名”:“第三姓名”,
“id”:“0071b034”
});
log('config after update:',config);
话虽如此,如果他的数据结构基于项目ID而不是索引,那么他所做的事情肯定会更容易。感谢您的回答,Festo,但是如何在不推送的情况下将更新的项目添加到数组中??更新索引配置[index]=项索引应该是元素的索引。您可以使用for循环扫描它,或者在获取它之前保存它。我尝试这样循环,但没有成功。也许我将开始搜索以实现外部数据库,如mongodbThanks Festo我开始使用lodash,但现在我的id消失了。在更新函数中,我使用lodash,如下所示:var index=xof(config,xof.find(config,item));
config.splice(index,1,item);
然后json.stringify(config,null,4)
在posts.json上,更新项目的id不见了。话虽如此,如果他的数据结构基于项目id而不是索引,那么他所做的事情肯定会更容易。感谢您的回答,Festo,但是如何在不推送的情况下将更新项目添加到数组中?更新索引配置[index]=项索引应该是元素的索引。您可以使用for循环扫描它,或者在获取它之前保存它。我尝试这样循环,但没有成功。也许我将开始搜索以实现外部数据库,如mongodbThanks Festo我开始使用lodash,但现在我的id消失了。在更新函数中,我使用lodash,如下所示:var index=xof(config,xof.find(config,item));
config.splice(index,1,item);
然后json.stringify(config,null,4)
在posts.json上更新的项的id不见了。??