我正在尝试更新存储在Express App中的JSON文件中的项目。基本上我正在读取JSON文件的内容,更新Id提取的项目并将更新的项目写入文件。问题? 它附加了更新的项目,因此我得到了重复项。我看不出错误在哪里?
posts.json:
[
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name",
"description": "test second description",
"slug": "second-name",
"id": "0071b034"
}
]
创建更新-delete.js:
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);
};
如果更新项目, posts.json 将如下所示:
[
{
"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"//
}
]
现在有了lodash,更新项目中的ID消失了吗? 谁能解释一下? - 谢谢
答案 0 :(得分:2)
有两个问题:
您使用push
在列表中插入新项目的内容,这就是复制&#39;
config[item.id] = item;
不是有效的参考。你的配置不是这样的:
[&#34; 0071b034&#34;:{name:&#34; Foo&#34;}]
所以配置中的键是0,1,2而不是item.id
我建议使用lodash。有许多有用的功能,但如果你坚持这个实现,请使用:
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;
答案 1 :(得分:0)
我不明白,你为什么在splice
中使用update
函数?在JavaScript中,当您处理对象或数组时,您使用它们的引用,而不是副本。因此,您可以使用以下内容替换splice
:
var obj = _.find(config, ['id', item.id]);
_.assign(obj, item);
在这种情况下,如果item包含所有必填字段,则不关心,因为assign
方法将仅更新指定的那些字段。
同时,如果您100%确定新项目将始终指定所有字段,那么Festo的解决方案会更好,因为它只是替换新项目上旧项目的引用,这要快得多。 / p>
var config = [
{
"name": "first name",
"description": "test first description",
"slug": "first-name",
"id": "2f065d59"
},
{
"name": "second name",
"description": "test second description",
"slug": "second-name",
"id": "0071b034"
}
];
function update(item) {
// Your read file logic.
var obj = _.find(config, ['id', item.id]);
_.assign(obj, item);
// Your write file logic.
}
console.log('config befor update:', config);
update({
"name": "third name",
"id": "0071b034"
});
console.log('config after update:', config);
<script src="https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js"></script>