0

0

如何通过对比新旧数组识别被拖拽移动的元素

霞舞

霞舞

发布时间:2026-02-06 13:16:45

|

424人浏览过

|

来源于php中文网

原创

如何通过对比新旧数组识别被拖拽移动的元素

本文介绍一种基于邻接关系对比的方法,用于在拖拽排序场景中精准识别数组中唯一被移动的元素,适用于 html 列表拖放后的状态比对。

在实现可拖拽排序的前端列表(如使用 Sortable.js 或原生 Drag and Drop API)时,一个常见需求是:仅知道拖拽前后的两个数组,如何准确判断哪个元素被移动了? 由于拖拽本质上是“移除 + 插入”,被移动项的前后相邻元素会发生变化,而其他元素的局部邻接关系大多保持不变——这正是我们识别的关键依据。

核心思路:利用邻接元素(neighbors)的变化定位移动项

对于每个元素,我们记录它在原数组中的前驱与后继 ID(边界处用 '-' 占位);同样计算其在新数组中的邻接 ID。若某元素在新旧数组中两个邻接 ID 均不匹配(即原前驱/后继均未出现在新邻接对中),则该元素极大概率是被主动拖拽的目标。

开拍
开拍

用AI制作口播视频

下载
✅ 优势:无需额外状态标记,仅依赖数组结构;对单次单元素移动鲁棒性强。 ⚠️ 注意:当仅交换两个相邻元素(如 [A,B] → [B,A])时,二者邻接关系均会改变,此时无法唯一确定“谁拖了谁”——但按题设要求,任选其一即可接受。

实现代码(ES6+)

function findMovedItem(oldArr, newArr) {
  // 构建旧数组中每个 id 的邻接映射:{ id: [prevId, nextId] }
  const oldNeighbors = oldArr.reduce((map, { id }, i, arr) => {
    const prev = i === 0 ? '-' : arr[i - 1].id;
    const next = i === arr.length - 1 ? '-' : arr[i + 1].id;
    map[id] = [prev, next];
    return map;
  }, {});

  // 构建新数组中每个 id 的邻接映射
  const newNeighbors = newArr.reduce((map, { id }, i, arr) => {
    const prev = i === 0 ? '-' : arr[i - 1].id;
    const next = i === arr.length - 1 ? '-' : arr[i + 1].id;
    map[id] = [prev, next];
    return map;
  }, {});

  // 筛选出邻接关系完全改变的元素(两个邻居均不匹配)
  return oldArr.filter(({ id }) => {
    const [oldPrev, oldNext] = oldNeighbors[id];
    const [newPrev, newNext] = newNeighbors[id];
    // 检查:旧前驱和旧后继都不在新邻接对中
    return ![newPrev, newNext].includes(oldPrev) && ![newPrev, newNext].includes(oldNext);
  });
}

// 示例验证
const oldArr = [{id: 'id1'}, {id: 'id2'}, {id: 'id3'}, {id: 'id4'}, {id: 'id5'}, {id: 'id6'}];
const newArr = [{id: 'id1'}, {id: 'id2'}, {id: 'id5'}, {id: 'id3'}, {id: 'id4'}, {id: 'id6'}];

console.log('Moved item:', findMovedItem(oldArr, newArr)); 
// 输出: [{id: 'id5'}]

补充说明与边界处理

  • 性能:时间复杂度为 O(n),适用于数百项以内的列表;超大规模建议结合 Map 优化查找。
  • ID 唯一性:该方法严格依赖 id 字段全局唯一且稳定(不可重复、不可为空)。
  • 多移动场景:本方案默认假设仅有一个元素被移动;若支持多元素拖拽,需扩展逻辑(如统计邻接变化频次或引入 diff 算法)。
  • 空数组/单元素:函数对 length ≤ 1 的数组仍安全(邻接均为 '-',不会误判)。

掌握这一邻接对比思想,不仅能解决拖拽识别问题,还可延伸至版本差异分析、列表变更日志生成等场景——核心在于:结构化地捕捉局部关系变化,而非仅比对绝对位置。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

196

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

224

2025.12.24

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

931

2023.09.19

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.27

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

26

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 2万人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.9万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 10.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号