js交换数组元素位置

1,004 阅读1分钟
/**
 * @msg: 交换数组两个临近元素位置
 * @return {*} 交换位置的新数组
 * @param {Array} data 要交换元素的数组
 * @param {Number} index 交换的元素索引
 * @param {String} type up 或 down 与上一元素交换 或 与下一元素交换
 * @param {String,Array} key 如果是对象数组可以选则同时交换对象内部value 提供一个key 字符串 或者 key 字符串数组
 */
export function moveArrayEl(data, index, type, key) {
  if (type === 'up' && index === 0) return data
  if (type === 'down' && index === data.length - 1) return data
  const res = _.cloneDeep(data)
  let reIndex = 0
  type === 'up' ? (reIndex = index - 1) : type === 'down' ? (reIndex = index + 1) : reIndex;
  [res[index], res[reIndex]] = [res[reIndex], res[index]]
  if (_.isString(key)) {
    if (res[index][key] && res[reIndex][key]) {
      [res[index][key], res[reIndex][key]] = [res[reIndex][key], res[index][key]]
    } else {
      console.log(`${key} not in an array of object`)
    }
  } else if (_.isArray(key)) {
    for (let i = 0; i < key.length; i++) {
      if (res[index][key[i]] && res[reIndex][key[i]]) {
        [res[index][key[i]], res[reIndex][key[i]]] = [res[reIndex][key[i]], res[index][key[i]]]
      } else {
        console.log(`${key} not in an array of object`)
      }
    }
  }
  return res
}