簡體   English   中英

如何創建一個帶有對象的 javascript 集?

[英]how to create a javascript Set with objects?

我有一個帶有以下內容的 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

就像 Pointy 的第一條評論所說的,對象只有在引用內存中的相同位置時才在 JavaScript 中彼此相等。 例如,

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

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

Set沒有任何解決辦法。 我在類似情況下做過的一件事是遍歷數組並創建一個字典(使用 JavaScript ObjectMap ),為每個項目生成一個唯一的鍵,然后遍歷該ObjectMap以獲得唯一的時間。

例如,在您的情況下,類似於:

const availableTimesMap = availableTimes.reduce((acc, timeObject) => {
  const key = `${timeObject.type}-${timeObject.time}`;
  acc[key] = timeObject;
}, {});

const uniqueTimes = Object.values(availableTimesMap);

希望這可以幫助。 如果您有任何問題,請告訴我。

我在自己的項目中遇到了類似的問題。 為了解決這個問題,我最終不得不使用字符串作為 Map 對象的鍵。 您需要找出一種標准方法來標識時間,以便將兩個“相同”時間轉換為相同的字符串。 簡單地使用時間可能會很好地工作。

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"]}
]

我不確定你想要得到的結果的結構是什么。 我假設如果你想獲得一組非重復的對象並且每個對象看起來像這樣:{"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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM