如何从JSON删除完全重复的值

时间:2019-11-01 11:07:36

标签: javascript arrays json

我有2个JSON对象

obj1 = [
  {
    "start": "2019-11-15T00:00:00",
    "end": "2019-11-15T23:59:59",
    "Room Night": "2019-11-15"
  },
  {
    "start": "2019-11-13T00:00:00",
    "end": "2019-11-13T23:59:59",
    "Room Night": "2019-11-13"}
  {
    "start": "2019-11-14T00:00:00",
    "end": "2019-11-14T23:59:59",
    "Room Night": "2019-11-14"
  }
]

obj2 = [
  {
    "start": "2019-11-15T00:00:00", 
    "end": "2019-11-15T23:59:59", 
    "Room Night": "2019-11-15"
  },
  {
    "start": "2019-11-13T00:00:00",
    "end": "2019-11-13T23:59:59",
    "Room Night": "2019-11-13"
  },
  {
    "start": "2019-11-16T00:00:00",
    "end": "2019-11-16T23:59:59",
    "Room Night": "2019-11-16"
  },
  {
    "start": "2019-11-17T00:00:00", 
    "end": "2019-11-17T23:59:59", 
    "Room Night": "2019-11-17"
  }
] 

在上述2个JSON中,我有2个重复的“ Room Nights”,日期分别为2019-11-13和2019-11-15。我想删除所有重复的值,并以JSON格式获取如下输出。

[
  {
    "start": "2019-11-14T00:00:00", 
    "end": "2019-11-14T23:59:59", 
    "Room Night": "2019-11-14"
  },
  {
    "start": "2019-11-16T00:00:00",
    "end": "2019-11-16T23:59:59",
    "Room Night": "2019-11-16"
  },
  {
    "start": "2019-11-17T00:00:00", 
    "end": "2019-11-17T23:59:59",
    "Room Night": "2019-11-17"
  }
] 

请帮忙解决一下。

关于, 假装。

3 个答案:

答案 0 :(得分:1)

可以通过filtersome方法完成:

let obj1= [
{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},
{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},
{"start": "2019-11-14T00:00:00", "end": "2019-11-14T23:59:59", "Room Night": "2019-11-14"}
];

let obj2= [
{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},
{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},
{"start": "2019-11-16T00:00:00", "end": "2019-11-16T23:59:59", "Room Night": "2019-11-16"},
{"start": "2019-11-17T00:00:00", "end": "2019-11-17T23:59:59", "Room Night": "2019-11-17"}
]

const merged = obj1.concat(obj2);
const duplicates = obj2.filter(o=> obj1.some(s=> s["Room Night"]==o["Room Night"]));
const result = merged.filter(f=> !duplicates.some(s=> 
    s["Room Night"] == f["Room Night"] 
));
console.log(result);

没有箭头功能:

let obj1= [
{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},
{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},
{"start": "2019-11-14T00:00:00", "end": "2019-11-14T23:59:59", "Room Night": "2019-11-14"}
];

let obj2= [
{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},
{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},
{"start": "2019-11-16T00:00:00", "end": "2019-11-16T23:59:59", "Room Night": "2019-11-16"},
{"start": "2019-11-17T00:00:00", "end": "2019-11-17T23:59:59", "Room Night": "2019-11-17"}
]

const merged = obj1.concat(obj2);
const duplicates = obj2.filter( function(o) {
return obj1.some(function(s) {
    return s["Room Night"] ==o ["Room Night"];
});
});

const result = merged.filter(function(f) {
return !duplicates.some(function(s) {
    return s["Room Night"] == f["Room Night"] }
    );
});
console.log(result);

答案 1 :(得分:1)

此解决方案虽然不好,但可以完成工作。我不建议使用JSON.stringify将对象用作键,但这就是我在这里所做的:

const obj1 = [
  { start: '2019-11-15T00:00:00', end: '2019-11-15T23:59:59', 'Room Night': '2019-11-15' },
  { start: '2019-11-13T00:00:00', end: '2019-11-13T23:59:59', 'Room Night': '2019-11-13' },
  { start: '2019-11-14T00:00:00', end: '2019-11-14T23:59:59', 'Room Night': '2019-11-14' }
]

const obj2 = [
  { start: '2019-11-15T00:00:00', end: '2019-11-15T23:59:59', 'Room Night': '2019-11-15' },
  { start: '2019-11-13T00:00:00', end: '2019-11-13T23:59:59', 'Room Night': '2019-11-13' },
  { start: '2019-11-16T00:00:00', end: '2019-11-16T23:59:59', 'Room Night': '2019-11-16' },
  { start: '2019-11-17T00:00:00', end: '2019-11-17T23:59:59', 'Room Night': '2019-11-17' }
]

const s = s => JSON.stringify(s)
const p = s => JSON.parse(s)

const combined = [...obj1, ...obj2]
const mapEntries = [...combined.reduce((a, v) => a.set(s(v), (a.get(s(v)) || 0) + 1), new Map()).entries()]
const out = mapEntries.reduce((a, v) => (v[1] === 1 && a.push(p(v[0])), a), [])


console.log(out)

答案 2 :(得分:-2)

 let obj1= [{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},{"start": "2019-11-14T00:00:00", "end": "2019-11-14T23:59:59", "Room Night": "2019-11-14"}];

let obj2=[{"start": "2019-11-15T00:00:00", "end": "2019-11-15T23:59:59", "Room Night": "2019-11-15"},{"start": "2019-11-13T00:00:00", "end": "2019-11-13T23:59:59", "Room Night": "2019-11-13"},{"start": "2019-11-16T00:00:00", "end": "2019-11-16T23:59:59", "Room Night": "2019-11-16"},{"start": "2019-11-17T00:00:00", "end": "2019-11-17T23:59:59", "Room Night": "2019-11-17"}]

obj1 = obj1.concat(obj2);
let temp=[];
let result=[];
obj1.forEach(x=>{
if(temp.indexOf(x['Room Night']) == -1){
temp.push(x['Room Night']);
result.push(x);
}
})

console.log(result);