在Nodejs中如何从JSON对象数组中删除重复项

3

我正在尝试根据以下JSON的id删除重复的条目,但似乎我无法正确解析JSON。我的JSON数组如下:

[ '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"57"},{"name":"sample","id":"acc"}]}\n',
  '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
  '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
  '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"}]}\n',
]

输出应该是:
{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"57"},{"name":"sample","id":"acc"}]}

我的代码如下所示:
removeDups: async function(listent){
      for (i = 0; i < listent.length; i++){
        console.log(listent.length)
         for (j = 0; j < listent.length; j++){
           console.log(listent[j])
       }
        var standardsList = this.arrUnique(listent);
        console.log("standard", standardsList)
    }
    },

    arrUnique: function (arr) {
      var cleaned = [];
      arr.forEach(function(itm) {
          var unique = true;
          cleaned.forEach(function(itm2) {
              if (_.isEqual(itm, itm2)) unique = false;
          });
          if (unique)  cleaned.push(itm);
      });
      return cleaned;

      }

谢谢。对于第二和第三项,acc57 是唯一的 id,但是因为第一项的 id 都相同,所以使用的 id 将是所有项目共享的 id,这是规则吗?是查找唯一的 id,还是使用所有项目共享的任何 ID - CertainPerformance
@NidhiSharma 你可以使用 _.uniq 来解决这个问题。但是,你需要将响应解析成可以被 JS 消化的形式(使用 JSON.parse)。 - trk
2个回答

1

我希望这对您有用: https://jsfiddle.net/c0pkw5ju/

核心功能包括:

var val = array.reduce(function (acc, val) {
    return acc.concat(val.entries)
}, [])

console.log(_.unique(val, function (v) {
    return v.id
}))

基本上,你需要将以\n分隔的JSON响应转换为JS对象,以便按照指示进行使用。如果这不起作用,请告诉我。
输出:
[
  {
    "name": "sample",
    "id": "8d"
  },
  {
    "name": "sample",
    "id": "57"
  },
  {
    "name": "sample",
    "id": "acc"
  },
  {
    "name": "sample",
    "id": "50"
  },
  {
    "name": "sample",
    "id": "ac"
  }
]

更新:

假设响应为:

var response = ['{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"57"},{"name":"sample","id":"acc"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"}]}\n',
]

如果您按照此处所示的方式处理响应:
var array = response.map(function(val) {
    return JSON.parse(val.trim())
})

然后核心功能应该可以正常工作。

我尝试了这个方法,它完全正常运行,唯一的问题是我无法将JSON中的/n转换为JS对象。我尝试了JSON.parse,但它打印出与arr相同的输出。 - Nidhi Sharma
@NidhiSharma 稍等...让我看看能否为此撰写一些内容... - trk

1
运行代码片段,您将看到与您在问题中提到的完全相同的输出。我希望这对您(和其他人)有所帮助。愉快的编程 :)

const data = ['{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"57"},{"name":"sample","id":"acc"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"},{"name":"sample","id":"ac"}]}\n',
    '{"entries":[{"name":"sample","id":"8d"},{"name":"sample","id":"50"}]}\n',
];

// Let us first format it correctly 
const formatted = data.map(x => {
    return JSON.parse(x.trim())
});

// Let's loop over our newly created array and push unique values into a new one

let uniqueNames = [];
let uniqueObj = [];

for(let i = 0; i < formatted.length; i++){    
    if(uniqueNames.indexOf(data[i]._id) === -1){
       uniqueObj.push(data[i])
       uniqueNames.push(data[i]._id);
       }        
    }

// Let's take that one step further and display it exactly as you wanted it to be :)
const iterator = uniqueObj.values();

for (const value of iterator) {
   console.log(value);
}


@NidhiSharma 不用客气。如果可以的话,请考虑给我一个赞并接受我的回答(当你有机会的时候)**:)** - Dzenis H.
我已经点赞了,你能否看一下这个链接 https://stackoverflow.com/questions/52796929/how-to-use-for-loop-along-with-the-request-get-to-get-the-first-few-parts-from-u,你有什么想法吗? - Nidhi Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接