如何创建一个带有对象的javascript集合?

时间:2020-03-27 01:13:28

标签: javascript

我有一个带有以下内容的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

3 个答案:

答案 0 :(得分:2)

就像Pointy的第一个评论所说,如果对象引用内存中的相同位置,则它们在JavaScript中仅是彼此相等的。例如,

const object1 = { foo: 'bar' };
const object2 = object1;

object1 === object2 //true;
{ foo: 'bar' } === { foo: 'bar' } //false

Set无法解决任何问题。在类似情况下,我要做的一件事是遍历数组并创建字典(使用JavaScript ObjectMap),为每个项目生成唯一的键,然后遍历该{ {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);