我有一个带有以下内容的json文件businessList.json
[
{"availableTimes": [{"type": "time", "time": "06:30"}, {"type": "time", "time": "07:00"}]},
{"availableTimes": [{"type": "time", "time": "08:30"}, {"type": "time", "time": "07:00"}]}
]
在另一个文件中,我试图以此创建一个集,但是它将不起作用,它将显示所有重复的值。我假设这是因为对象如何通过引用传递。我该如何解决才能达到预期的效果?
const timesAvailable = new Set()
businessList.map(item => item.availableTimes.map(item => timesAvailable.add(item))) //won't work
答案 0 :(得分:2)
就像Pointy的第一个评论所说,如果对象引用内存中的相同位置,则它们在JavaScript中仅是彼此相等的。例如,
const object1 = { foo: 'bar' };
const object2 = object1;
object1 === object2 //true;
{ foo: 'bar' } === { foo: 'bar' } //false
Set
无法解决任何问题。在类似情况下,我要做的一件事是遍历数组并创建字典(使用JavaScript Object
或Map
),为每个项目生成唯一的键,然后遍历该{ {1}}或Object
以获取唯一时间。
例如,在您的情况下,类似:
Map
希望这会有所帮助。如果您有任何问题,请告诉我。
答案 1 :(得分:0)
我在自己的项目中遇到了类似的问题。为了解决这个问题,我最终不得不使用字符串作为Map对象的键。您需要弄清楚一次ID的标准方法,以便将两个“相同”的时间转换为相同的字符串。简单地使用时间可能就足够了。
const timesAvailable = new Map()
businessList.forEach(item =>
item.availableTimes.forEach(item =>
timesAvailable.add(item.time, item)
)
)
或者,您可以删除对象而只使用字符串时间。
[
{"availableTimes": ["06:30", "07:00"]},
{"availableTimes": ["08:30", "07:00"]}
]
答案 2 :(得分:0)
我不确定您想要得到的结果的结构。我假设如果要获取一组非重复的对象,并且每个对象看起来像这样:{“ type”:“ time”,“ time”:“ 06:30”}。
let businessList = [
{"availableTimes": [{"type": "time", "time": "06:30"}, {"type": "time", "time": "07:00"}]},
{"availableTimes": [{"type": "time", "time": "08:30"}, {"type": "time", "time": "07:00"}]}
]
const timesAvailable = new Set(); // a set of strings representing time, which is used for checking duplicates
const availableBusiness = new Set(); //the result we want
for(let business of businessList) {
for (let availableTime of business.availableTimes) {
if(availableTime.type === "time") {
if(!timesAvailable.has(availableTime.time)){
timesAvailable.add(availableTime.time);
availableBusiness.add(availableTime);
}
}
}
}
console.log(availableBusiness);
console.log(timesAvailable);