【问题标题】:Underscore - Compare two arrays of objects (positions)下划线 - 比较两个对象数组(位置)
【发布时间】:2014-06-20 22:21:05
【问题描述】:

有没有办法根据元素位置的变化来比较数组之间的差异?

我有一个原始对象数组,其中一个元素的值发生了变化,这个变化被映射到一个新数组中:

   origElements = [{id: 1, value: 50}, 
                   {id: 2, value: 60}, 
                   {id: 3, value: 70}]

changedElements = [{id: 1, value: 50},
                   {id: 3, value: 60}, 
                   {id: 2, value: 120}]


var diff = _.difference(_.pluck(origElements, "id"), _.pluck(changedElements, "id"));
var result = _.filter(origElements, function(obj) { return diff.indexOf(obj.id) >= 0; });

在这种情况下,很清楚为什么“结果”不会返回任何内容。因为 [1, 2, 3] 和 [1, 3, 2] 之间的值没有区别。我在这里试图实现的是一个“严格的区别”,它也会查看索引,从而返回对对象新顺序的一些引用。

【问题讨论】:

  • 如果加入pluck的结果呢?这样你就会有一个唯一的字符串。
  • 你真的关心 id 索引的变化吗?这似乎无关紧要。还是你关心价值的变化?
  • 我关心索引的变化,因为我在 DOM 上使用动画来模拟元素的位置变化。当这个动画结束时,我只是让一个把手助手在 DOM 上渲染排序的元素。 @amandiel 可能有用,我会试试的

标签: javascript arrays sorting underscore.js


【解决方案1】:

这样做怎么样:

var origElements = [{
    id: 1,
    value: 50
}, {
    id: 2,
    value: 60
}, {
    id: 3,
    value: 70
}];

var changedElements = [{
    id: 1,
    value: 50
}, {
    id: 3,
    value: 60
}, {
    id: 2,
    value: 120
}];

var origElementsIds = _.pluck(origElements, "id");
var changedElementsIds = _.pluck(changedElements, "id");
console.log("Are array element positions same ?", 
    origElementsIds.join() === changedElementsIds.join());

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多