首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据object值获取数组列表的range

根据object值获取数组列表的range
EN

Stack Overflow用户
提问于 2019-10-30 12:37:21
回答 3查看 206关注 0票数 2

我的清单如下所示

代码语言:javascript
运行
复制
[{"type":"A"},{"type":""},{"type":""},{"type":"B"},{"type":"C"},{"type":""},{"type":"A"},{"type":"A"},{"type":"D"},{"type":"C"}]

类型后面的任何空类型都被认为是该类型。

例如:{"type":"A"},{"type":""},{"type":""}其中三个项目被归类为A类型

例如:{"type":"A"},{"type":"A"}将列出范围6-7而不是6,7

如何获得每种类型的范围(通过索引)。我正在寻找的输出如下所示:

代码语言:javascript
运行
复制
 A: 0-2, 6-7
 B: 3
 C: 4-5, 9
 D: 8
EN

回答 3

Stack Overflow用户

发布于 2019-10-30 13:40:17

您可以执行以下操作:

代码语言:javascript
运行
复制
const types = [{"type":"A"},{"type":""},{"type":""},{"type":"B"},{"type":"C"},{"type":""},{"type":"A"},{"type":"A"},{"type":"D"},{"type":"C"}]

const getStrIfCommas = (commas, c) => {
  const lastStr = commas[commas.length - 1]
  const lastStrResult = lastStr.includes('-')
    ? lastStr.replace(/\d+$/, c)
    : lastStr + `-${c}`
  return --commas.length
    ? `${commas.join(', ') || ''}, ${lastStrResult}`
    : lastStrResult
}

const getStrIfNextInt = (a, c) => {
  const commas = a.str.toString().split(', ')
  return commas.length
    ? getStrIfCommas(commas, c)
    : `${a.str}-${c}`
}

const getStrIfPrev = (a, c) => a.prev + 1 === c
  ? getStrIfNextInt(a, c)
  : a.str.length
    ? `${a.str}, ${c}`
    : ''

const result = Object
  .entries(types.reduce((a, { type }, i) => {
    if (type) {
      a[type] = a[type] || []
      a[type].push(i)
      a.prev = type
    } else if (a.prev) {
      a[a.prev].push(i)
    }
    return a
  }, {}))
  .reduce((acc, [k, indexes]) => {
    if (Array.isArray(indexes)) {
      acc[k] = indexes.reduce((a, c) => {
        a.str = a.hasOwnProperty('prev')
          ? getStrIfPrev(a, c)
          : c
        a.prev = c
        return a
      }, {})
      .str
    }
    return acc
  }, {})

console.log('Formatted result:', result)
代码语言:javascript
运行
复制
.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

票数 1
EN

Stack Overflow用户

发布于 2019-10-30 12:51:33

可以与基于某个键值是否存在的条件一起使用。如果type"",则可以将"A"用作默认值

代码语言:javascript
运行
复制
let input = [{
  "type": "A"
}, {
  "type": ""
}, {
  "type": ""
}, {
  "type": "B"
}, {
  "type": "C"
}, {
  "type": ""
}, {
  "type": "A"
}, {
  "type": "D"
}, {
  "type": "C"
}];

let output = input.reduce((a, i, index) => {
  let key = i.type || 'A';
  a[key] ? a[key].push(index) : (a[key] = [index]);
  return a;
}, {});
console.log(output);

票数 0
EN

Stack Overflow用户

发布于 2019-10-30 16:40:37

实现相同功能的另一种方法如下:

代码语言:javascript
运行
复制
var d =[{"type":"A"},{"type":""},{"type":""},{"type":"B"},{"type":"C"},{"type":""},{"type":"A"},{"type":"A"},{"type":"D"},{"type":"C"}];
var ranges = {}; 
d.forEach(function(item,key){
	var ind = key;
	var val = item.type;
	while(val == ""){
		ind = ind-1;
		val = d[ind].type;
	}
	if(!ranges[val]){
        ranges[val] = [];
        ranges[val].push(key);
    }
	else{
        var length = ranges[val].length;
		if( d[key-1].type == d[key].type || d[key-1].type == val){
             var splits = ranges[val][length-1].toString().split('-');		
			 ranges[val][length-1] = splits[0] +"-"+key;
        }else{
             ranges[val].push(key);
        }
    }
});
Object.keys(ranges).forEach(function(key){
console.log(key+":"+ranges[key].join(","));
})

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58618832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档