如何使用`JSON.parse`的reviver函数将数据添加到数组中的每个对象?

时间:2017-12-30 02:02:17

标签: javascript json

假设我将以下JSON对象保存在这样的变量中:

var musicList = {
  "files": [
        {
          "title": "Ironic"
        },
        {
          "title": "It's Beginning To Look A Lot Like Christmas"
        },
        {
          "title": "Sweet Dreams"
        }
      ] 
};

这是一个学习练习,我们将这个JSON对象转换为一个字符串,然后再将它解析回一个对象......

console.log(musicList); // prints the object in the musicList variable
var stringifiedMusic = JSON.stringify(musicList);
console.log(stringifiedMusic); // prints the string version of the musicList object

但我不希望得到我想要的结果,即使用files键为数组中的每个对象添加一个简单的递增ID号。我相信我没有正确地写出复活功能......

var parsedMusic = JSON.parse(stringifiedMusic, function(key, value) {
  var idIncrementor = 0;
  var incrementorObject = [
    {id: idIncrementor}
  ];

  if (key === 'files') {
    idIncrementor++;
    return value.map(function (item, index) {
      return Object.assign({}, item, incrementorObject[index]);
    });
  }
  return value;
});

就像现在一样,这似乎只是将id: 0键值对添加到第一个对象而不是其他对象。这必须是因为if (key === 'files')...语句只有一次才真实。如果我只有ifkey个参数传入函数,我会在value语句中检查哪些对数组中的三个对象都是正确的?

1 个答案:

答案 0 :(得分:1)

您无需创建新对象。如果使用正确,map函数将返回一个新数组(带有新对象)。您可以使用map提供的索引来获取您的ID。

DEMO

var musicList = {
  "files": [
        {
          "title": "Ironic"
        },
        {
          "title": "It's Beginning To Look A Lot Like Christmas"
        },
        {
          "title": "Sweet Dreams"
        }
      ] 
};

var stringifiedMusic = JSON.stringify(musicList);

var parsedMusic = JSON.parse(stringifiedMusic, function(key, value) {

  if (key === 'files') {
    return value.map(function (item, index) {
      item.id = index;
      return item;
    });
  }
  return value;
});

console.log("parsedMusic", parsedMusic)