深入学习D3JS:d3-array Transformations部分

d3.rollup(iterable, reduce, …keys)

将可迭代的值转化为Map,转化结果从key到value,并支持嵌套。

function dogroup(values, keyof) {
  const map = new Map();
  let index = -1;
  for (const value of values) {
    const key = keyof(value, ++index, values);
    const group = map.get(key);
    if (group) group.push(value);
    else map.set(key, [value]);
  }
  return map;
}

export default function rollup(values, reduce, ...keys) {
  return (function regroup(values, i) {
    if (i >= keys.length) return reduce(values);
    const map = dogroup(values, keys[i]);
    return new Map(Array.from(map, ([k, v]) => [k, regroup(v, i + 1)]));
  })(values, 0);
}

这里rollup返回一个立即执行函数,该函数会首先执行一次dogroup函数,根据keys的对应关系生成一个map,然后根据keys的长度去递归的调用regroup生成嵌套map,最后调用reduce。形成一条k=>k=>value递归链。用法如下:

d3.rollup(data, v => v.length, d => d.name, d => d.date)

结果为

Map(3) {
  "jim" => Map(1) {
    "11/12/2015" => 1
  }
  "carl" => Map(1) {
    "11/12/2015" => 1
  }
  "stacy" => Map(1) {
    "01/04/2016" => 2
  }
}

d3.group(iterable, …keys)

import identity from "./identity.js";
import rollup from "./rollup.js";

export default function group(values, ...keys) {
  return rollup(values, identity, ...keys);
}

identity.js

export default function(x) {
  return x;
}

该函数是简化的rollup,rollup的结果是key对应到value上,group则是key对应到数组上,减少了计算值的一个函数(使用默认的identity)。用法如下:

data = [
  {name: "jim",   amount: "34.0",   date: "11/12/2015"},
  {name: "carl",  amount: "120.11", date: "11/12/2015"},
  {name: "stacy", amount: "12.01",  date: "01/04/2016"},
  {name: "stacy", amount: "34.05",  date: "01/04/2016"}
]
d3.group(data, d => d.name)
Map(3) {
  "jim" => Array(1)
  "carl" => Array(1)
  "stacy" => Array(2)
}

d3.cross(…iterables[, reducer])

function length(array) {
  return array.length | 0;
}

function empty(length) {
  return !(length > 0);
}

function arrayify(values) {
  return typeof values !== "object" || "length" in values ? values : Array.from(values);
}

function reducer(reduce) {
  return values => reduce(...values);
}

export default function cross(...values) {
  const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop());//如果最后参数传入函数,对每一个valuesz执行该函数
  values = values.map(arrayify);//调用array,from将values转化为数组
  const lengths = values.map(length);//length保存数组长度的数组
  const j = values.length - 1;
  const index = new Array(j + 1).fill(0);//见过这道题。。
  const product = [];
  if (j < 0 || lengths.some(empty)) return product;//如果数组长度小于0或者有数组为空,就返回一个空数组
  while (true) {//这个函数修改了原数组的顺序
    product.push(index.map((j, i) => values[i][j]));
    let i = j;
    while (++index[i] === lengths[i]) {
      if (i === 0) return reduce ? product.map(reduce) : product;
      index[i--] = 0;
    }
  }
}

返回两个数组的笛卡儿积。

d3.merge(iterables)

和concat类似,讲数组进行合并,用法如下:

d3.merge([[1], [2, 3]]); // returns [1, 2, 3]
function* flatten(arrays) {
  for (const array of arrays) {
    yield* array;
  }
}

export default function merge(arrays) {
  return Array.from(flatten(arrays));
}

实现中用到了生成器函数返回生成器的迭代器对象,再通过array.from转化成数组,array.from转化条件有2条,1,是要求维数组对象,拥有一个length属性和若干索引属性的任意对象2,可迭代对象,可以获取对象中的元素,如map,set

d3.pairs(iterable[, reducer])

d3.pairs([1, 2, 3, 4]); // returns [[1, 2], [2, 3], [3, 4]]
d3.pairs([1, 2, 3, 4], (a, b) => b - a); // returns [1, 1, 1];

返回一个数组对,如果给定了reducer函数,返回计算后的数组。

export default function pairs(values, pairof = pair) {
  const pairs = [];
  let previous;
  let first = false;
  for (const value of values) {
    if (first) pairs.push(pairof(previous, value));
    previous = value;
    first = true;
  }
  return pairs;
}

export function pair(a, b) {
  return [a, b];
}

这个很简单,就是一个for循环,用一个previous记录上一个数组的值,第一次有特殊处理。

d3.permute(array, indexes)

permute(["a", "b", "c"], [1, 2, 0]); // returns ["b", "c", "a"]
export default function(source, keys) {
  return Array.from(keys, key => source[key]);
}

根据输入的数组以及一个key值数组,修改原数组顺序。

d3.shuffle(array[, start[, stop]])

export default function shuffle(array, i0 = 0, i1 = array.length) {
  var m = i1 - (i0 = +i0),
      t,
      i;

  while (m) {
    i = Math.random() * m-- | 0;
    t = array[m + i0];
    array[m + i0] = array[i + i0];
    array[i + i0] = t;
  }

  return array;
}

随机打乱数组顺序,说是用Fisher–Yates Shuffle算法,代码就是一个随机数互换位置。

d3.ticks(start, stop, count)

d3.range([start, ]stop[, step])

根据输入值返回一个数组。

export default function(start, stop, step) {
  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;

  var i = -1,
      n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
      range = new Array(n);

  while (++i < n) {
    range[i] = start + i * step;
  }

  return range;
}

d3.zip(arrays…)

根据输入数组,返回的多维数组第i个元素包含每个输入数组的第一个元素。

import min from "./min.js";

export default function(matrix) {
  if (!(n = matrix.length)) return [];
  for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
    for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
      row[j] = matrix[j][i];
    }
  }
  return transpose;
}

function length(d) {
  return d.length;
}

d3.transpose(matrix)

和d3.zip一样对矩阵进行操作

d3.ticks(start, stop, count)

根据输入,返回一个分段数组,这个有点复杂,后面在仔细分析。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "failed to resolve: jp.wasabeef:glide-transformations:4.0.0" 是一个编译错误,意味着程序无法解决这个特定的依赖项。 这个错误通常出现在使用了依赖管理工具如Gradle或Maven时。它表明在项目构建过程中,无法正确找到并下载所需的依赖项。 有几个常见的原因会导致这个错误出现。首先,可能是因为你所使用的库的版本与你在构建文件中指定的版本不一致。在这种情况下,你需要确认库的最新版本,并更新你的构建文件。 其次,可能是因为库的地址错误或库不存在。你可以在Gradle或Maven的存储库中搜索以确定库是否存在,并检查库的名称和地址是否与你在构建文件中使用的版本一致。 最后,可能是由于网络连接错误,导致构建工具无法从存储库中下载依赖项。在这种情况下,你可以尝试使用代理或更改你的网络配置来解决问题。 总之,当你遇到"failed to resolve"的错误时,你需要检查构建文件中的依赖项的版本、地址以及你的网络连接,以确保能够成功解决依赖项。 ### 回答2: 在使用 Glide 图片加载库时出现了 "failed to resolve: jp.wasabeef:glide-transformations:4.0.0" 的错误。这个错误是由于 Gradle 无法解析指定的 Glide 图片转换库版本号4.0.0。 要解决这个问题,可以尝试以下几种方法: 1. 检查版本号:先确保正确的使用了最新版本的 Glide 和转换库。可以打开项目的 build.gradle 文件,查看 Glide 和转换库的版本号,确保二者兼容。 2. 检查依赖项:检查项目的 build.gradle 文件中是否正确添加了依赖项。需要确保在 dependencies 块中添加了正确的 Glide 和转换库依赖项,例如: ``` implementation 'com.github.bumptech.glide:glide:4.12.0' implementation 'jp.wasabeef:glide-transformations:4.3.0' ``` 3. 更新仓库:如果以上两个步骤都没问题,可能是 Gradle 无法从默认的 Maven 仓库中解析到转换库。可以尝试添加 `maven { url 'https://jitpack.io' }` 到项目的 build.gradle 文件中的 repositories 块中,确保 Gradle 可以解析 jitpack 仓库中的依赖。例如: ``` allprojects { repositories { // 其他仓库 maven { url 'https://jitpack.io' } } } ``` 4. 清理缓存:有时 Gradle 缓存可能会引起问题,可以尝试清理 Gradle 缓存并重新构建项目。可以通过在命令行运行 `./gradlew clean` 或者在 Android Studio 中点击 "Build" -> "Clean Project" 来清理缓存。 以上是解决 "failed to resolve: jp.wasabeef:glide-transformations:4.0.0" 错误的一些常见方法。根据具体情况选取适合的解决方案,希望能帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值