繁体   English   中英

我有一段代码我无法理解

[英]I have a block of code I am unable to understand it

我在这里添加了一个 JavaScript 代码块。 我无法理解为什么要使用它。 如果有人明白这一点。

 _objListofData = _objListofData.reduce(function(item, e1) { var matches = item.filter(function(e2) { return e1.Code == e2.Code }); if (matches.length == 0) { item.push(e1); } return item; }, []);

您的代码用于根据 _objListofData 数组中的代码过滤掉不同的结果。 请参阅下面的示例,您将对此有所了解。

 var _objListofData = [{Code: 1},{Code: 2},{Code: 2}, {Code: 1},{Code: 2},{Code: 3}] _objListofData = _objListofData.reduce(function (item, e1) { var matches = item.filter(function (e2) { return e1.Code == e2.Code }); if (matches.length == 0) { item.push(e1); } return item; }, []); console.log(_objListofData);

它似乎正在根据Code属性过滤掉数组中的重复项。 一种更直观的方法可能是:

const uniqueMap = _objListofData.reduce((map, item) => {
    if (!map.has(item.Code)) {
        map.set(item.Code, item);
    }
    return map;
}, new Map());
const uniques = Array.from(uniqueMap.values());

该代码将数组“减少”为单个 map。 如果它遇到一个在它被丢弃之前看到的键。 最后,它从Map中获取唯一键的values列表。

有趣的问题。 这里有一些建议:

  1. 不要使用reduce,使用其他东西。 即使对于有经验的开发人员来说,也很难理解包含“reduce”的代码。
  2. 使用类型定义(TypeScript),从长远来看,它将帮助您和您的团队。
  3. 奖金。 如果您确实需要使用 reduce(或任何难以理解的代码),请将示例输入和 output 作为注释!

分析输入的类型

我认为, _objListOfData是一个 object 数组,上面有一个Code属性,它的值是一个number 像这样的东西:

[ 
  { Code: 1 }, 
  { Code: 15 }, 
  { Code: 17 }, 
  { Code: 90 } 
]

概括

代码目标是使用相同的Code删除任何重复出现的 object 。 例如,从这个:

[{Code: 1}, {Code: 5}, {Code: 2}, {Code: 1}]

进入这个:

[{Code: 1}, {Code: 5}, {Code: 2}]

逐步了解

  1. 减少accept两个参数,分别是function和initialValue。
  2. 在您的情况下, initialValue 是一个空数组[]
  3. 在您的情况下,function 就是这个人:
function(item, e1) {
  var matches = item.filter(function(e2) {
    return e1.Code == e2.Code
  });
  if (matches.length == 0) {
    item.push(e1);
  }
  return item;
}

item的值将从您传递的 initialValue 开始,经过一次迭代后,该值将传递给下一次迭代。 e1的值将是_objListofData数组中的每个项目。

  1. 在第一次迭代中, item将具有 [] 的值,而e1将具有数组中某个项目的值,例如(例如)它是{ Code: 1 } 然后,它会 go 过滤你给的空数组,搜索任何具有相同代码的项目,如果有任何匹配,它将返回到var matches 然后,它检查matches的长度,如果它等于 0,则没有匹配,因此该项目是唯一的,我们希望它们在我们的结果数组中。 最后,您要返回item以便将其传递到下一次迭代。
  2. 在第二次迭代中,我们有item equals [ { Code: 1} ] 然后,假设我们的下一个项目是{ Code: 2 } 然后过滤器将再次工作,但没有匹配项,因此值{ Code: 2 }将再次推送到item数组。
  3. 在第三次迭代中,我们有item equals [ { Code: 1 }, { Code: 2 } ] 然后,假设我们的下一个项目是{ Code: 1 } 这一次,过滤器会取消这个值,所以这个值不会被压入item数组。 因此我们的item值仍然保持在[ { Code: 1 }, { Code: 2 } ]

您绝对可以在这里查看综合指南: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM