javascript - 使用 VueJs 的相似对象是不同的
问题描述
我在我的 Vuex 商店中使用以下 getter 从我的状态获取数据集。
getDatasets: state => {
let datasets = [];
state.observations.forEach(obs => {
if (!datasets.includes(obs.dataset)) {
datasets.push(obs.dataset);
}
})
return datasets;
}
但是,这会返回与我所在州的观察结果一样多的数据集,而它应该只返回一个数据集。
我相信这是由于__obs__
VueJs 添加的字段对于每个数据集对象都不同。
我误解了什么,我该如何解决这个问题?
解决方案
这不是 vuex/vue 的问题。通过检查datasets.includes(obs.dataset))
,您实际上是在检查是否datasets
包含与 具有相同引用的任何对象obs.dataset
,这不可避免地是错误的。
可以在浏览器控制台中运行一个非常简单的示例来复制您的逻辑:
var state = { observations: [ { dataset: {}}, { dataset: {}} ]}
var datasets = []
state.observations.forEach(function(obs) {
if (!datasets.includes(obs.dataset)) {
datasets.push(obs.dataset);
}
})
console.log(datasets.length) // 2, not 1
console.log(datasets[0] === state.observations[0].dataset) // true, same reference
console.log(datasets[0] === state.observations[1].dataset) // false
如果要获取数据集的唯一值,请尝试比较已解析的对象字符串:
state.observations.forEach(obs => {
if (!datasets.some(
elem => SON.stringify(elem) === JSON.stringify(obs.dataset))
) {
datasets.push(obs.dataset);
}
})
推荐阅读
- javascript - 正则表达式括号之间的 HTML 恢复问题
- ruby-on-rails - 更新 Heroku 上的 PostGIS 扩展
- c# - 仅将更改应用于特定表
- docker - Moodle docker 安装问题 mysql_full_unicode_support#File_format 和 mysql_full_unicode_support#Large_prefix
- ios - 设备检查 API - 唯一 ID
- informatica - informatica 中的 Reg_match 函数
- javascript - 如何通过反应中的提交按钮选择随机api
- libev - 将 open62541 集成到现有的 libev 事件循环中
- android - 使用 ContentProvider 时的 SQL 注入
- onem2m - 确定通知的 MIME 类型