在Json文件中查找和替换项目

时间:2016-02-06 21:32:44

标签: javascript arrays json node.js express

我正在尝试更新存储在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消失了吗? 谁能解释一下? - 谢谢

2 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 您使用push在列表中插入新项目的内容,这就是复制&#39;

  2. 的原因
  3. config[item.id] = item;不是有效的参考。你的配置不是这样的:

    [&#34; 0071b034&#34;:{name:&#34; Foo&#34;}]

  4. 所以配置中的键是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>