#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());