[英]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 Object
或Map
),為每個項目生成一個唯一的鍵,然后遍歷該Object
或Map
以獲得唯一的時間。
例如,在您的情況下,類似於:
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.