【问题标题】:Get index of value for a grouped array获取分组数组的值索引
【发布时间】:2019-07-07 18:50:22
【问题描述】:

我有一个 Ids 数组

 [1,1,1,2,2,2,3,3,...]

还有另一个values数组

[0,1,0,0,0,1,1,0,...]

我需要知道Ids这组从零开始的索引是什么,在JavaScript中对应的值是1

因此,对于这个数组,我们可能会得到
[1,2,0,...],因为如果您要按唯一值对 Id 数组进行分组,那是 Values 数组中 1 的索引。

每组 ID 应该只有一个 1。有可能是这组Id可能乱序了

(即[1,1,2,1,2,2,3,3,...])。

但是当 Id 数组被分组时,我仍然想要索引是什么。

我尝试了一个 while 循环,但不断得到重复的值。然后我尝试过滤我的数组。我如何在 JS 中实现这一点?

例子:

array 1 (IDs) : [1,1,1,2,2,2,3,3,3,3] .   
array 2 (values) : [0,1,0,0,1,0,0,0,0,1] .  
result array: [1,1,3] .  

array 3 (IDs) : [1,2,1,3,1,1,2,2,3] .  
array 4 ( values) : [0,0,1,0,0,0,1,0,1] .  
result array : [1,1,1] . 

【问题讨论】:

  • 请补充为什么你会得到[1, 2, 0]
  • 这个例子应该是 [1, 2, 5, ..] 还是我误解了这个问题?
  • 另外,如果“ID 组可能乱序”,其他数组的顺序是否相同?这是一个非常不清楚的问题。
  • @NinaScholz 我试图用我最近的编辑来解释它。基本上就是分组Id数组时Value数组中1的索引
  • @M.Elkady 我重新表述了我的问题,可能更有意义

标签: javascript arrays indexing


【解决方案1】:

您可以为同一组获取一个索引计数器,并在找到带有 1 的值时获取该值。

示例 3:

[1, 2, 1, 3, 1, 1, 2, 2, 3]  ids
[0, 0, 1, 0, 0, 0, 1, 0, 1]  values
 0  0  1  0  2  3  1  2  1   indices by group
       ^           ^     ^   result

function getIndices(ids, values) {
    var map = new Map;
    return ids.reduce((r, v, i) => {
        if (values[i] === 1) r.push(map.get(v) || 0);
        map.set(v, (map.get(v) || 0) + 1);
        return r;
    }, []);
}

// [1, 2, 0]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3], [0, 1, 0, 0, 0, 1, 1, 0]));

// [1, 1, 3]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1]));

// [1, 1, 1]
console.log(...getIndices([1, 2, 1, 3, 1, 1, 2, 2, 3], [0, 0, 1, 0, 0, 0, 1, 0, 1]));

代替Map,您可以将对象作为哈希表来索引值。

function getIndices(ids, values) {
    var hash = Object.create(null);
    return ids.reduce((r, v, i) => {
        hash[v] = hash[v] || 0;
        if (values[i] === 1) r.push(hash[v]);
        hash[v]++;
        return r;
    }, []);
}

// [1, 2, 0]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3], [0, 1, 0, 0, 0, 1, 1, 0]));

// [1, 1, 3]
console.log(...getIndices([1, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1]));

// [1, 1, 1]
console.log(...getIndices([1, 2, 1, 3, 1, 1, 2, 2, 3], [0, 0, 1, 0, 0, 0, 1, 0, 1]));

【讨论】:

  • 谢谢@NinaScholz,你完全理解了。没有“地图”有什么办法吗?这是我很难理解的。
猜你喜欢
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多