集合不会移除具有不同引用的对象.即使对象具有相同的值,这些对象也不会被视为相同的:
const arr = [
// These objects look the same but are both unique objects in memory, so they have different references
{foo: 1},
{foo: 1}
];
const res = [...new Set(arr)];
console.log(res); // [{foo: 1}, {foo: 1}]
您的情况类似于上面的示例,因为JSX <option ...></option>
在幕后创建对象.
相反,我建议您使用different method来对devices
数组中的重复对象进行重复数据消除.仅当您的devices
数组在useMemo()
的帮助下更改时(假设devices
为状态),您才能执行此重复数据消除,例如:
const uniqueDevices = useMemo(() => {
const uniqueMap = new Map(devices.map(device => [
device.device_id, // deduplicate by the `device_id` property
device
]);
return [...uniqueMap.values()];
}, [devices]);
// please post your code as text so we don't have to retype this :)
return <div>
<h1>Devices</h1>
<select>
{ devices ?
? uniqueDevices.map(device => <option key={device.device_id}>{device.device_id}</option>)
: null
}
</select>
</div>
如果您只需要在JSX中引用每个device
对象的device_id
属性,那么您可以继续使用Set()
来删除重复项,如@andrew所示:
const uniqueDeviceIds = useMemo(() =>
Array.from(new Set(devices.map(device => device.device_id)))
, [devices]);
return <div>
<h1>Devices</h1>
<select>
{ devices ?
? uniqueDeviceIds.map(deviceId => <option key={deviceId}>{device_id}</option>)
: null
}
</select>
</div>