javascript - 根据给定值选择相关的颜色代码

标签 javascript arrays typescript

因此,如果zoneTempDiff1的值小于假设的1.5,则应考虑temp:1颜色;如果zoneTempDiff1的值大于1.5,则应考虑temp:2颜色。
同样,对于所有不同的值,如果它是-1或-2或0或1或2或3或4或5,则相应的温度值颜色
如果zoneTempDiff1的值大于+6或-6,则应采用相应的temp:-6或temp:+6颜色

floor.entities.forEach(elementId => {

  let objTemp: any = {};

  objTemp.currentTemp = 68;
  (values might be different)
  objTemp.desiredTempHeating = 70.5;
  (values might be different)

  let zoneTempDiff1 = objTemp.currentTemp - objTemp.desiredTempHeating;
  let tempColor1 = this.temperatureColors.filter(color => zoneTempDiff1 < (color.temp + 1) && zoneTempDiff1 > (color.temp - 1));
  objTemp.tempColorToInsert = tempColor1.color;

  floor.droppeditem.push(objTemp);
});


temperatureColors: any = [{
    color: '#50B3D3',
    temp: -6
  },
  {
    color: '#25CBE4',
    temp: -4
  },
  {
    color: '#25CBE4',
    temp: -3
  },
  {
    color: '#7EE2DD',
    temp: -2
  },
  {
    color: '#7EE2DD',
    temp: -1
  },
  {
    color: '#89DE6F',
    temp: 0
  },
  {
    color: '#89DE6F',
    temp: 1
  },
  {
    color: '#D2E143',
    temp: 2
  },
  {
    color: '#D2E143',
    temp: 3
  },
  {
    color: '#FDCB31',
    temp: 4
  },
  {
    color: '#FDCB31',
    temp: 5
  },
  {
    color: '#F59A4A',
    temp: 6
  }
];

最佳答案

您到底要问什么?

我们这样调用函数:

getColor(68, 78, colors);


我们传入当前温度,所需温度和颜色对象数组。

const getColor = (current, desired, colors) => {


然后,我们找出温度之间的差异,并将其round精确到整数。

const diff = Math.round(current - desired);


我们获取colors数组中最后一个元素的索引

const last = colors.length - 1;


现在,我们检查差异是否小于或等于数组的第一个颜色对象中给定的temp属性。如果是这样,我们可以返回颜色,我们就完成了。

if (diff <= colors[0].temp) return colors[0].color;


这里基本上是一样的,但是我们检查是否大于或等于数组中最后一个颜色对象中的温度。

if (diff >= colors[last].temp) return colors[last].color;


由于它不是这两者之一,因此我们需要遍历数组和find等于diff的对象。

return colors.find(color => diff === color.temp).color;


这有帮助吗?



const colors = [{
    color: '#50B3D3',
    temp: -6
  },
  {
    color: '#25CBE4',
    temp: -5
  },
  {
    color: '#25CBE4',
    temp: -4
  },
  {
    color: '#25CBE4',
    temp: -3
  },
  {
    color: '#7EE2DD',
    temp: -2
  },
  {
    color: '#7EE2DD',
    temp: -1
  },
  {
    color: '#89DE6F',
    temp: 0
  },
  {
    color: '#89DE6F',
    temp: 1
  },
  {
    color: '#D2E143',
    temp: 2
  },
  {
    color: '#D2E143',
    temp: 3
  },
  {
    color: '#FDCB31',
    temp: 4
  },
  {
    color: '#FDCB31',
    temp: 5
  },
  {
    color: '#F59A4A',
    temp: 6
  }
];

const getColor = (current, desired, colors) => {
  const diff = Math.round(current - desired);
  const last = colors.length - 1;
  if (diff <= colors[0].temp) return colors[0].color;
  if (diff >= colors[last].temp) return colors[last].color;
  return colors.find(color => diff === color.temp).color;
}

console.log(getColor(68, 78, colors));
console.log(getColor(78, 68, colors));
console.log(getColor(78, 72, colors));
console.log(getColor(78, 73, colors));
console.log(getColor(73, 78, colors));
console.log(getColor(73, 73.8, colors));
console.log(getColor(73, 73.4, colors));





好的,新功能。

这次我们只获取差异,然后使用Array.reduce从数组中选择所需的颜色对象。它的代码更少(地道,它是单行代码),但解密起来却有点困难。它也更具弹性,您不需要输入阵列中的每个温差。



temperatureColors = [{
    color: '#50B3D3',
    temp: -6
  },
  {
    color: '#25CBE4',
    temp: -4
  },
  {
    color: '#25CBE4',
    temp: -3
  },
  {
    color: '#7EE2DD',
    temp: -2
  },
  {
    color: '#7EE2DD',
    temp: -1
  },
  {
    color: '#89DE6F',
    temp: 0
  },
  {
    color: '#89DE6F',
    temp: 1
  },
  {
    color: '#D2E143',
    temp: 2
  },
  {
    color: '#D2E143',
    temp: 3
  },
  {
    color: '#FDCB31',
    temp: 4
  },
  {
    color: '#FDCB31',
    temp: 5
  },
  {
    color: '#F59A4A',
    temp: 6
  }
];

const getColor2 = (current, desired, colors) => colors.reduce((acc, cur) => (current - desired) >= cur.temp ? cur : acc).color;

console.log(getColor2(68, 78, temperatureColors));
console.log(getColor2(78, 68, temperatureColors));
console.log(getColor2(78, 73, temperatureColors));
console.log(getColor2(73, 78, temperatureColors));
console.log(getColor2(73, 73.8, temperatureColors));
console.log(getColor2(73, 73.4, temperatureColors));





降低

Reduce在数组上工作。它将每个数组元素提供给回调,并最终返回单个值。

例如,假设我们有一个数组[1, 2, 3]。一个简单的例子是将数组简化为所有元素的总和。 reduce回调是所有魔术的全部。

回调获得4个参数:一个累加器,当前元素,当前元素的索引以及数组本身。

让我们来看一下累加器。这是难题的魔力。累加器的值在数组的每个“循环”中均可用。因此,如果回调返回某些内容,它将被放置在累加器中。当reduce循环遍历每个元素时,它将返回累加器。这是最终返回的单个值。

因此,从本质上讲,提供给reduce函数的回调就在那里操纵累加器。

累加器从什么开始?那要看。

[1, 2, 3].reduce(callback);


累加器将从第一个数组元素(1)开始,并在第二个元素处开始循环。

[1, 2, 3].reduce(callback, 0);


在这里,我们将累加器初始化为零,并且reduce将开始与第一个元素循环。

因此,如果我们要添加数组,我们可以说:

[1, 2, 3].reduce( (accumulator, current) => accumulator + current )


这会将当前值添加到累加器并返回它,并继续对数组的每个元素执行此操作。

在这种情况下:

const getColor2 = (current, desired, colors) => colors.reduce((acc, cur) => (current - desired) >= cur.temp ? cur : acc).color;


我们遍历您的对象数组。如果温度差大于或等于当前对象中的温度,则我们将该对象设置为累加器。完成后,返回累加器,然后弹出一个对象。

您可以使用Array.find,但这需要进行更复杂的比较,该比较必须确定您的差异是否在两个值之间。我只是不断浏览并更新最终值。

嘿,-1比-6大吗?是啊酷,-6是我们的男孩。下一个循环,嘿,-1是否大于-4?是的,好的,-4是我们想要的。下一个循环大于-1。最终,您命中了0,累加器停止更新。它循环遍历数组的其余元素,并确定它不大于任何这些值,因此累加器永远不会更新。我们分配给累加器的最后一件事被吐出来,那就是我们想要的对象。

关于javascript - 根据给定值选择相关的颜色代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58212596/

相关文章:

javascript - 如何在 Angular JS 中为 {{expression}} 文本着色并将所有文本保留在一行中?

javascript - 简单的 for 循环会变得无限,我不知道为什么

Javascript 下拉菜单

arrays - 是否有返回两个子数组 : one of specified size and another of the remaining contents? 的 Ruby Array 方法

C - fscanf 进入动态数组崩溃

angular - ngrx forms 8 reducer 不更新状态

javascript - (ZEND) 在 javascript 中路由到 index.phtml

angular - 在模板中使用 Observable

javascript - TypeScript - 如何在类定义之外添加方法

javascript - 将此 javascript 对象从 jQuery 传递到 PHP?