Javascript 查找并替换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":

我正在尝试更新Express应用程序中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"
    }
]
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”}]

  • 因此,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有两个问题:

  • 您使用
    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不见了。??