Подчеркивание — сравнение двух массивов объектов (позиций)

#javascript #arrays #sorting #underscore.js

#javascript #массивы #сортировка #underscore.js

Вопрос:

Есть ли способ сравнить различия между массивами на основе изменений в позициях их элементов?

У меня есть исходный массив объектов, который претерпевает изменение в одном из значений его элемента, это изменение отображается в новый массив:

    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]. Чего я пытаюсь добиться здесь, так это «строгого различия», которое также будет учитывать индекс, возвращая таким образом некоторую ссылку на новый порядок объектов.

Комментарии:

1. что, если вы присоединитесь к результату pluck? таким образом, у вас будет уникальная строка.

2. Вас действительно волнует изменение индексов для идентификатора? Это кажется неуместным. Или вас волнует изменение значения?

3. Я забочусь об изменении индексов, потому что я использую анимацию в DOM для имитации изменения позиций элементов. Когда эта анимация заканчивается, я просто позволяю помощнику handlebars отображать отсортированные элементы в DOM. @amandiel это может сработать, я собираюсь попробовать

Ответ №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());