Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按键将数组列表的元素分组/连接在一起_Javascript_Arrays_Angular_Typescript_Ramda.js - Fatal编程技术网

Javascript 按键将数组列表的元素分组/连接在一起

Javascript 按键将数组列表的元素分组/连接在一起,javascript,arrays,angular,typescript,ramda.js,Javascript,Arrays,Angular,Typescript,Ramda.js,我有以下数据结构作为输入 我希望在不丢失任何数据的情况下实现数据的特殊分组 const input = [ { Id: 10, name: "Test_10", points: [{…}, {…}, {…}], label: "Label_10", level: "1", unit: "%" }, { Id: 20, name: "Test_10", points: [{…}, {…}, {…}, {…}], label:

我有以下数据结构作为输入

我希望在不丢失任何数据的情况下实现数据的特殊分组

const input =
[
  {
   Id: 10,
   name: "Test_10",
   points: [{…}, {…}, {…}],
   label: "Label_10",
   level: "1",
   unit: "%"
  },
  {
   Id: 20,
   name: "Test_10",
   points: [{…}, {…}, {…}, {…}],
   label: "Label_10",
   level: "1",
   unit: "%"
  },
  {
   Id: 30,
   name: "Test_10",
   points: [{…}, {…}, {…}],
   label: "Label_10",
   level: "2",
   unit: "°C"
  },
  {
   Id: 40,
   name: "Test_10",
   points: [{…}, {…}, {…}, {…}],
   label: "Label_10",
   level: "2",
   unit: "°C"
  }
]
在我的转换/分组之后,我希望有下面的输出。我希望在同一“级别”中结合所有点信息。因此,我在“1”级的输出中有七个点。但是我只想要我的一级物品,而不是二级物品。有没有一个简单的方法来实现这一点?(可能,但对于ramda或rxjs以外的函数是必要的?)

您可以使用JavaScript的方法来实现这一点

function groupByLevel(level) {
  return input.reduce((arr, currentValue) => {

    if (currentValue.level === level) {
      const index = arr.findIndex(item => item.level === level);

      if (index === -1) {
        arr.push(currentValue);
      } else {
        arr[index].points = arr[index].points.concat(currentValue.points);
      }
    } else {
      arr.push(currentValue);
    }

    return arr;
  }, []);
}
演示:

const输入=[{
Id:10,
名称:“测试10”,
要点:[1,2,3],
标签:“标签10”,
级别:“1”,
单位:“%”
},
{
身份证号码:20,
名称:“测试10”,
要点:[4,5,6,7],
标签:“标签10”,
级别:“1”,
单位:“%”
},
{
Id:30,
名称:“测试10”,
要点:[1,2,3],
标签:“标签10”,
级别:“2”,
单位:“C”
},
{
身份证号码:40,
名称:“测试10”,
要点:[4,5,6,7],
标签:“标签10”,
级别:“2”,
单位:“C”
}
]
功能组级别(级别){
返回输入。减少((arr,currentValue)=>{
如果(currentValue.level==级别){
const index=arr.findIndex(item=>item.level==level);
如果(索引==-1){
arr.push(当前值);
}否则{
arr[index].points=arr[index].points.concat(currentValue.points);
}
}否则{
arr.push(当前值);
}
返回arr;
}, []);
}
console.log(groupByLevel(“1”))使用分组和筛选
演示

const输入=[{
Id:10,
名称:“测试10”,
要点:[1,2,3],
标签:“标签10”,
级别:“1”,
单位:“%”
},
{
身份证号码:20,
名称:“测试10”,
要点:[4,5,6,7],
标签:“标签10”,
级别:“1”,
单位:“%”
},
{
Id:30,
名称:“测试10”,
要点:[1,2,3],
标签:“标签10”,
级别:“2”,
单位:“C”
},
{
身份证号码:40,
名称:“测试10”,
要点:[4,5,6,7],
标签:“标签10”,
级别:“2”,
单位:“C”
}
]
让水平分组;
功能过滤器元件(el){
常量topElement=LevelsGroup[el.level]
如果(!topElement){
标高组[el.level]=el;
返回true;
}
topElement.points.concat(高程点);
返回false;
}
函数groupInput(){
levelsGroups={};
返回输入。过滤器(filterElement);
}
log(groupInput())更新
我对下面的原始解决方案不太满意。此版本不包含任何依赖项,如果不是非常清晰,则是一个相当简单的ES6解决方案:

const combine=(a,b)=>
({…b,点:a.points.concat(b.points)})
const mergeLevel1Points=xs=>
[xs.filter(x=>x.level=='1').reduce(合并,{points:[]}),…xs.filter(x=>x.level!='1')]
常量输入=[
{Id:10,名称:“Test_10”,点数:[1,2,3],标签:“label_10”,级别:“1”,单位:“%”,
{Id:20,名称:“测试10”,分数:[4,5,6,7],标签:“标签10”,级别:“1”,单位:“%”,
{Id:30,名称:“测试10”,分数:[8,9],标签:“标签10”,等级:“2”,单位:“C”},
{Id:40,名称:“测试10”,分数:[10,11,12],标签:“标签10”,等级:“2”,单位:“C”}
]
控制台日志(
合并级别1点(输入)
)
const输入=[
{Id:10,名称:“Test_10”,点数:[1,2,3],标签:“label_10”,级别:“1”,单位:“%”,
{Id:20,名称:“测试10”,分数:[4,5,6,7],标签:“标签10”,级别:“1”,单位:“%”,
{Id:30,名称:“测试10”,分数:[8,9],标签:“标签10”,等级:“2”,单位:“C”},
{Id:40,名称:“测试10”,分数:[10,11,12],标签:“标签10”,等级:“2”,单位:“C”}
];
const mergeLevelOnePoint=R.pipe(
R.分区(R.propEq('level','1')),
R.zipWith(
R.call,
[
右管(
还原
(R.mergeDeepWithKey)(键,左,右)=>(
关键点=='点'
?右鼻孔(左、右)
:对
)))
({}),
R.of,
),
R.身份,
],
),
R.unnest,
);
log(mergeLevelOnePoint(输入))

您尝试了什么?我尝试了groupBy label,然后将相同的对象合并到一起,但这不起作用。我无法在我的输出中将数据点组合在一起谢谢你的回答,这适用于我的特殊情况。当我有两个以上的级别时,输入中可能会有第三个级别的条目。我能做什么,只将级别1和2分组在一起,让级别3保持不变?这是我的新输入:
const input=[{Id:10,名称:“Test_10”,点数:[1,2,3],标签:“label_10”,等级:“1”,单位:“%”,{Id:20,名称:“Test_10”,点数:[4,5,6,7],标签:“label_10”,等级:“1”,单位:“%”,{Id:30,名称:“Test_10”,点数:[8,9],标签:“label_10”,等级:“2”,单位:“{Id:40,名称:“Test u 10”,点数:[10,11,12],标签:“标签10”,等级:“2”,单位:“C”},{Id:50,名称:“测试10”,点数:[13,14,15],标签:“标签10”,等级:“2”,单位:“C”},{Id:60,名称:“测试10”,点数:[100200],标签:“标签10”,等级:“3”,单位:“C”}
您的原始解决方案非常好,也许您可以更新这两个解决方案,这样我就可以遵循这两种策略并更好地理解它。提前谢谢,我可以定义如下内容:我的管道中除了“3”之外的所有级别吗?这将是一种节约,因为除3之外的所有内容都将被合并。我不需要知道我的输入中会出现哪个新级别,我只需要这个级别不应该出现的信息grouped@Maverick777:请不要试图将StackOverflow视为代码编写服务。这只是一个问答网站。然而,这应该是一个容易的改变。向主函数添加一个参数,该函数是从项目到
true
false
(即谓词)的函数,编写
not
函数(
(fn)=>(…args)=>!fn(…args)
)并传递
myPredicate
not(myP>)
function groupByLevel(level) {
  return input.reduce((arr, currentValue) => {

    if (currentValue.level === level) {
      const index = arr.findIndex(item => item.level === level);

      if (index === -1) {
        arr.push(currentValue);
      } else {
        arr[index].points = arr[index].points.concat(currentValue.points);
      }
    } else {
      arr.push(currentValue);
    }

    return arr;
  }, []);
}