Javascript 如果数组返回0值,则需要回退值
我正在为图形输出的基值计算一个最小值。我的一个数组正在输出一个零值,因此不符合要求并返回未定义的值Javascript 如果数组返回0值,则需要回退值,javascript,arrays,lodash,Javascript,Arrays,Lodash,我正在为图形输出的基值计算一个最小值。我的一个数组正在输出一个零值,因此不符合要求并返回未定义的值 const data = [ {value:0}, {value:0}, {value:0} ]; const defaultMinThreshold = 0; const minThreshold = _.min([parseFloat(_.minBy(_(data).filter(d => d.value > 0).value(), 'value').
const data = [
{value:0},
{value:0},
{value:0} ];
const defaultMinThreshold = 0;
const minThreshold = _.min([parseFloat(_.minBy(_(data).filter(d => d.value > 0).value(), 'value').value) - 0.5, defaultMinThreshold]);
如果数据的任何值大于0
,例如
const data = [
{value:1},
{value:0},
{value:0} ];
这会将minThreshold
返回为0
——这是预期的。当/如果所有值都是0
时,我需要它返回0
,而不是返回undefined
我需要在其中放入一个条件,用于搜索至少有1个值大于0的值的数据,否则默认情况下返回0
JS小提琴-
n、 b正如您所看到的,我确实会将值过滤为>0
,我可以将>=0
,但这会将该数据集中可能具有零值的数组的基数降低为0,因此无法更改此值
筛选的原因是数据的值是否为
const data = [
{value:4},
{value:4},
{value:3} ];
如果大于,则最小值将返回3,因此阈值将为3,图形将从3开始,而不是从零开始。如果您不必完全使用Lodash,这里有一些功能性和可读性的内容。如果您愿意,您也可以将其转换为纯Lodash解决方案
如果您不必完全使用Lodash,这里有一些功能性和可读性的东西。如果您愿意,您也可以将其转换为纯Lodash解决方案
在我看来,您的代码更容易理解,编写方式如下:
const values = data.map(d => d.value);
const hasNonZero = values.some(v => v > 0);
const minThreshold = hasNonZero ? _.min(values) : 0;
我只使用lodash作为\uuu.min
,这在这里很方便。您还可以将其替换为Math.min(…值)
或Math.min.apply(null,值)
测试
const数据集=[
[
{值:0},
{值:0},
{值:0}
],
[
{value:1},
{值:0},
{值:0}
],
[
{value:4},
{value:4},
{值:3}
]
];
函数getMinThreshold(数据){
常量值=data.map(d=>d.value);
const hasNonZero=value.some(v=>v>0);
const minThreshold=hasNonZero?Math.min(…值):0;
返回最小阈值;
}
dataSets.forEach(data=>console.log(getMinThreshold(data)))
在我看来,您的代码更容易理解,编写方式如下:
const values = data.map(d => d.value);
const hasNonZero = values.some(v => v > 0);
const minThreshold = hasNonZero ? _.min(values) : 0;
我只使用lodash作为\uuu.min
,这在这里很方便。您还可以将其替换为Math.min(…值)
或Math.min.apply(null,值)
测试
const数据集=[
[
{值:0},
{值:0},
{值:0}
],
[
{value:1},
{值:0},
{值:0}
],
[
{value:4},
{value:4},
{值:3}
]
];
函数getMinThreshold(数据){
常量值=data.map(d=>d.value);
const hasNonZero=value.some(v=>v>0);
const minThreshold=hasNonZero?Math.min(…值):0;
返回最小阈值;
}
dataSets.forEach(data=>console.log(getMinThreshold(data)))
让我们分解逻辑,更好地展示正在发生的事情。我提取了代码,并将每个操作分解到单独的一行中,以便更容易看到:
const data = [
{value:0},
{value:0},
{value:0} ];
const defaultMinThreshold = 0;
const filterResult = _(data).filter(d => d.value > 0).value();
const minByResult = _.minBy(filterResult, 'value');
const minValue = minByResult.value;
const parsedValue = parseFloat(minValue);
const processedValue = parsedValue - 0.5;
const pair = [processedValue, defaultMinThreshold]
const minThreshold = _.min(pair);
首先,我将解决一些问题,并讨论一些可以进行的简化
这有点不必要,而且与lodash的其他调用不一致。最好是执行
\uu.filter(数据,d=>d.value>0)
-它既短又一致
所有三行只使用
值
属性并最终从中提取数字。因为不需要继续处理对象,所以可以提取值
并直接使用它。整个部分变成了一个整体
const mapResult = _.map(data, 'value');
const filterResult = _.filter(mapResult, d => d > 0);
const minValue = _.min(filterResult);
此外,minValue
-如果您有一个空数组,并且您尝试在其上使用\umin
或\umin.minBy
,您将得到未定义的。我会再谈这个问题
这是不必要的minValue
将已经是一个数字。JS有一个单一的数字类型,它已经是浮点数了——没有从整数到浮点数的“转换”,反之亦然。因此,不需要解析。可以删除整个线路
因此,知道minValue
可以是未定义的
,这里可以做一些事情来修正这一点。您可以使用三元minValue检查undefined
?minValue:0-0.5
,但我发现更容易确保从返回一个数字,即使它试图处理一个空数组
const minValue = _.min(filterResult) || 0; //if the first value is falsey (undefined), return zero
const processedValue = minValue - 0.5; //you might end up with a result of -0.5
const clampedValue = _.clamp(processedValue, 0, Infinity); //ensures the value is [0,) - zero (inclusive) to unbound maxiumum
把你得到的一切放在一起
const数据=[
{值:0},
{值:0},
{值:0}];
const defaultMinThreshold=0;
常量mapResult=551;.map(数据“值”);
常量filterResult=u2;.filter(映射结果,d=>d>0);
常量最小值=u0.min(filterResult)| | 0;
const processedValue=minValue-0.5;
const clampedValue=u.clamp(processedValue,0,无穷大);
常量对=[clampedValue,defaultMinThreshold];
const minThreshold=u.min(对);
console.log(minThreshold)
让我们打破逻辑,更好地展示正在发生的事情。我提取了代码,并将每个操作分解到单独的一行中,以便更容易看到:
const data = [
{value:0},
{value:0},
{value:0} ];
const defaultMinThreshold = 0;
const filterResult = _(data).filter(d => d.value > 0).value();
const minByResult = _.minBy(filterResult, 'value');
const minValue = minByResult.value;
const parsedValue = parseFloat(minValue);
const processedValue = parsedValue - 0.5;
const pair = [processedValue, defaultMinThreshold]
const minThreshold = _.min(pair);
首先,我将解决一些问题,并讨论一些可以进行的简化
这有点不必要,而且与lodash的其他调用不一致。最好是执行\uu.filter(数据,d=>d.value>0)
-它既短又一致
所有三行只使用值
属性并最终从中提取数字。因为不需要继续处理对象,所以可以提取值
并直接使用它。整个部分变成了一个整体
const mapResult = _.map(data, 'value');
const filterResult = _.filter(mapResult, d => d > 0);
const minValue = _.min(filterResult);
此外,minValue
-如果您有一个空数组,并且您尝试在其上使用\umin
或\umin.minBy
,您将得到未定义的。我会合作的
const processedValue = minValue - 0.5;
const minValue = _.min(filterResult) || 0; //if the first value is falsey (undefined), return zero
const processedValue = minValue - 0.5; //you might end up with a result of -0.5
const clampedValue = _.clamp(processedValue, 0, Infinity); //ensures the value is [0,) - zero (inclusive) to unbound maxiumum