Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果数组返回0值,则需要回退值_Javascript_Arrays_Lodash - Fatal编程技术网

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