2

我有两个数组oldArraynewArray. 当一个新值被输入时newArray,我想比较oldArray并取出新值。

在这些数组中,我存储哈希。

例如。

oldArray = []
newArray = [{"one": 1}]

我需要找到新元素,即{"one": 1}

使用 underscore.js 我可以做这样的事情:

newElement = _.difference(newValue, oldValue)

第一次效果很好,但是当我回去向数组添加更多内容时:

oldArray = [{"one": 1}]
newArray = [{"one": 1},{"two": 2}]

做同样的事情 newElement = _.difference(newValue, oldValue)

[{"one": 1},{"two": 2}]作为新对象回来了……是因为我在比较对象而不是值吗?有一个更好的方法吗。

以上是一个示例,但从我的应用程序中,我从控制台中提取了它

oldValue map.js:85
[Object]
0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object
length: 1
__proto__: Array[0]

newValue map.js:83
[Object, Object]

0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object

1: Object
$$hashKey: "009"
address: "france"
latLng: GeoCode
__proto__: Object
length: 2
__proto__: Array[0]

当我比较这两个时,我得到:

[Object, Object]
0: Object
$$hashKey: "007"
address: "england"
latLng: GeoCode
__proto__: Object

1: Object
$$hashKey: "009"
address: "france"
latLng: GeoCode
__proto__: Object
length: 2
__proto__: Array[0]

我目前在这个项目中使用 AngularJS 和 Underscore。

也许这样做会更好。我只需要从该数组中取出“不同”的对象。所以我可以用它来做其他事情。它并不总是最后一个元素。

更新

我也尝试过 JavaScript 数组集数学库并使用.substract但结果相同。这一定意味着哈希值正在改变——但在我看来它们不像

为了得到这些oldArraynewArray我正在使用 Angular $watch。

4

2 回答 2

1

如果$$hashKey始终是唯一的,那么您可以创建两个对象并将散列的键设为$$hashKey.

newObject[myObject["$$hashKey"]] = myObject;

然后

var difference = _.omit(newObject, _.keys(oldObject));

将为您提供一个对象,该对象仅包含新对象中的键/值对,而不是旧对象中的键/值对。

如果没有唯一键,不太方便的方法是将对象序列化和反序列化为字符串,然后使用_.difference.

于 2013-02-24T16:27:18.437 回答
0

不久前我遇到了一个类似的 AngularJS 挑战。虽然我不确定我是否可以为您提供有关如何管理此问题的绝对最佳答案,但我可以说对我有用:

首先:确保您正确使用 $watch。它需要3个参数:

  • watchExpression – {(function()|string)} – 在每个 $digest 循环中评估的表达式。返回值的更改会触发对侦听器的调用。字符串:评估为表达式函数(范围):以当前范围作为参数调用。
  • listener(optional) – {(function()|string)=} – 只要 watchExpression 的返回值发生变化,就会调用回调。字符串:评估为表达式函数(newValue,oldValue,scope):以当前值和先前值作为参数调用。
  • objectEquality(optional) – {boolean=} – 比较对象是否相等而不是参考。

最后一段尤为重要。你想在你的情况下观察 objectEquality ,所以一定要像这样使用 $watch :

$scope.$watch('watchObject', fn({}), true);

注意true上面第三个参数的使用。在Angular Scope 文档中查看更多信息中查看更多信息。

第二:当区分 Angular 对象时,我认为比较 $$hashKeys 的答案可能很有意义。您也可以考虑编写自己的 diff 函数,具体取决于您想要返回的内容。如果您想返回差异并且您只是查看比较基本对象,请尝试以下操作:jQuery objectDiff

第三:如果您想将一个对象与其中的嵌套对象和/或数组进行比较,事情会变得很困难。我为此编写了一个未优化的方法,如果您需要它,我会很乐意提供更多信息。

祝你好运!

于 2013-02-24T16:41:08.043 回答