【问题标题】:Set an occurrence count to the item in an array为数组中的项目设置出现次数
【发布时间】:2019-08-07 11:40:12
【问题描述】:

我有一个地址类型如下的数组:

var addressTypes = [
   { "id": 748, "type_id": 0, name:"Previous"},
   { "id": 749, "type_id": 0, name:"Previous"},
   { "id": 750, "type_id": 1, name:"Vacation"}
];

在我看来,我应该显示特定地址类型的名称及其出现次数,如下所示:

<span ng-bind="address.name + ' Address ' + ($index == 0 ? '' : $index + 1"</span>

如何手动计算和分配特定地址类型的出现次数以在视图中使用它而不是 $index。

例如,在我的结果数组中,我想得到这样的东西:

[ { "id": 748, "type_id": 0, namne: "Previous", count: 1},
  { "id": 748, "type_id": 0, name:  "Previous", count: 2},
  { "id": 750, "type_id": 1, name:  "Vacation", count: 1 }
]

【问题讨论】:

  • 您不应在模板表达式中赋值。首先使用所需的输出转换数组,然后根据您选择的设计显示它。
  • @briosheje OP 从未说过分配将在模板表达式中完成,“分配特定地址类型的出现次数以在视图中使用它而不是 $index”实际上表明相反..

标签: javascript arrays angularjs


【解决方案1】:

您可以使用以下代码实现此目的,

addressTypes.forEach(function(itm) {
  this[itm['id']] = (this[itm['id']] || 0) + 1;
  itm.count = this[itm['id']];
}, {});

只需使用forEach 及其上下文接收器即可。这样做就足够了。注意,当你使用上下文接收器时,你不能使用箭头函数。因为箭头功能不允许您手动设置上下文。

【讨论】:

    【解决方案2】:

    您可以使用Map 来跟踪每个名称的出现并相应地添加计数

    步骤:-

    • 将计数器初始化为Map
    • 循环遍历addressTypes 检查该名称是否存在于计数器中
    • 如果存在,则将 1 添加到之前的值,否则将其设置为 1
    • 在最终对象中添加计数属性并从计数器设置值

    let counter = new Map()
    var addressTypes = [{ "id": 748, "type_id": 0, name:"Previous"}, { "id": 749, "type_id": 0, name:"Previous"}, { "id": 750, "type_id": 1, name:"Vacation"}];
    
    let dataWithCount = addressTypes.map(obj=>{
        counter.set(obj.name,(counter.get(obj.name) || 0)+ 1)
        return {...obj, count: counter.get(obj.name)}
    })
    
    console.log(dataWithCount)

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2014-10-16
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多