【问题标题】:Javascript to group data using forloopJavascript 使用 for 循环对数据进行分组
【发布时间】:2020-09-14 15:53:55
【问题描述】:

我得到了下面的数据

const v=[
    ...
    [2,'apple'],
    [3,'apple'],
    [4,'apple'],
    [5,'banana'],
    [6,'banana'],
    [7,'orange'],
    [8,'apple'],
    [9,'orange'],
    [10,'orange'],
    ...
]

现在我想把它解析成

{start:2 , end:4, value: 'apple'},
{start:5 , end:6, value: 'banana'},
{start:7 , end:7, value: 'orange'},
{start:8 , end:8, value: 'apple'},
{start:9 , end:10, value: 'orange'},
...

所以我这样循环

arr = []
v.forEach((j, i) => {
    if (!start && !value) {
        let start = v[i][0]
        let value = v[i][1]
    }
    console.log(start,value)

    if (start && value) {
        if (v[i + 1] && v[i + 1][1] !== value) {
            let end = v[i][0]
            arr.push(
                {
                    start, end, value
                })
            delete start, end, value;
        }
    }
})

但我发现每个循环的开始和结束都会被重置。 所以我需要用另一种方式来循环/解析数据。

还有其他方法吗?

【问题讨论】:

    标签: javascript arrays loops for-loop


    【解决方案1】:

    您可以使用reduce 来实现相同的效果,以聚合水果元素和相对数字,
    然后map 结果:

    const v = [
      [2, 'apple'],
      [3, 'apple'],
      [4, 'apple'],
      [5, 'banana'],
      [6, 'banana'],
      [7, 'orange'],
      [8, 'apple'],
      [9, 'orange'],
      [10, 'orange'],
    ]
    
    const reduced = v.reduce((ac, [num, fruit]) => ({
      ...ac,
      [fruit]: [...(ac[fruit] || []), Number(num)]
    }), {})
    
    
    
    const mapped = Object.entries(reduced).map(([fruit, v]) => ({
      value: fruit,
      end: Math.max(...v),
      start: Math.min(...v)
    }))
    
    console.log('mapped', mapped)

    【讨论】:

    • 即使我也有同样的想法,但我有疑问,因为在某些情况下,开始和结束是重叠的
    • 如果我们把这段代码写在一行中去掉空格,它看起来就像一个魔法咒语:v.reduce((ac,[num,fruit])=>({...ac,[fruit]:[...(ac[fruit]||[]),Number(num)]}),{})...希望,对于主题启动器来说并没有那么难=D
    • @maioman 感谢您的回答,但 8 是苹果,而 9,10 又是橙色,它应该创建新元素...抱歉在问题中遗漏...
    • @brk 因为数据是在模板中循环的,我在其中处理了如果 start=end
    【解决方案2】:

    一个简单的循环检查最后一个索引是否相同。

    const v=[
        [2,'apple'],
        [3,'apple'],
        [4,'apple'],
        [5,'banana'],
        [6,'banana'],
        [7,'orange'],
        [8,'apple'],
        [9,'orange'],
        [10,'orange'],
    ]
    
    const result = []
    for (var i=0; i< v.length; i++) {
      var current = result[result.length-1];
      if (!current || current.value !== v[i][1]) {
        result.push({ start: v[i][0], end: v[i][0], value: v[i][1] });
      } else {
        current.end = v[i][0];
      }
    }
    
    console.log(result);

    使用减少

    const v=[
        [2,'apple'],
        [3,'apple'],
        [4,'apple'],
        [5,'banana'],
        [6,'banana'],
        [7,'orange'],
        [8,'apple'],
        [9,'orange'],
        [10,'orange'],
    ]
    
    const result = v.reduce( (result, [index, value]) => {
      const current = result[result.length-1];
      if (!current || current.value !== value) {
        result.push({ start: index, end: index, value });
      } else {
        current.end = index;
      }
      return result;
    }, [])
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      相关资源
      最近更新 更多