【问题标题】:Compare to dictionary elements typescript [duplicate]与字典元素打字稿比较[重复]
【发布时间】:2018-12-20 08:59:21
【问题描述】:

我有这样的模型:

class Model {
  from: number;
  values: { [id: string]: number };
  originalValues: { [id: string]: number };
}

然后我创建arr = Model[] = [];

我需要检查值是否与 originalValues 匹配,我就是这样做的:

 for (let edited of this.arr) {
  edited.model.forEach(m => {
    if (Object.values(m.originalValues) == Object.values(m.values)) {
    // console.log(equal);
    } else {
      // not equal
    }
  });

但即使它们相等,我总是得到not equal。 值和原始值的示例: originalValues: {11c33aaaaaaaaasafsdf33: 23.5} 我在这里做错了什么?

【问题讨论】:

  • 您在比较数组引用,而不是数组内容。
  • Object.values 将只获取值,而不是键,因此如果缺少键,则控制将丢失。此外,由于看起来您正在使用primitives,您可能会找到更快的方法。现在最大的问题是您正在比较 array references 而不是 values,因此引用永远不会相同,特别是在这种情况下。看看这个:stackoverflow.com/questions/1068834/…。此外,键和值是否总是以相同的顺序
  • 也许尝试使用JSON.stringify 将值转换为字符串,然后比较字符串?

标签: javascript typescript dictionary compare


【解决方案1】:

const log = args => console.log(args);


const array = [{
  values: [1, 2, 3],
  otherValues: [1, 2, 3]
}, {
  values: [1, 2, 3],
  otherValues: [1, 2, 3, 'a', 'b', 'c']
}, {
  values: [1, 2, 3],
  otherValues: [3, 2, 1]
},{
  values: [{ name: 'Jack' }, 'a', 'b', 'c', 1, 2, 3],
  otherValues: [1, 2, 3, 'a', 'b', 'c', { name: 'Jack' }]
}];


log('\nOriginal');
array.forEach(o => {
  const bool = JSON.stringify(o.values) === JSON.stringify(o.otherValues);
  log(bool);
});


log('\nEdit');
array.forEach(o => {
  const v1 = Object.values(o.values).sort(), v2 = Object.values(o.otherValues).sort();
  const bool = JSON.stringify(v1) === JSON.stringify(v2);
  log(bool);
});

【讨论】:

  • 附注:这仅在 两个对象中的键具有相同顺序时才有效。您可能会考虑在不满足该条件的情况下提供解决方案。
  • @briosheje 说得很好,我刚刚进行了编辑以在一定程度上迎合这一点。
【解决方案2】:

如果你只有数字、字符串、对象和数组,那么你可以简单地

JSON.stringify(originalValues)==JSON.stringify(values);

【讨论】:

  • 当心,这仅在originalValuesvalues 持有相同订单时才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2020-10-01
  • 2011-02-07
  • 2018-09-19
相关资源
最近更新 更多