如何比较单个数组及其键值

时间:2019-10-15 11:48:47

标签: javascript arrays arraylist

我有一个对象数组,在这里我需要比较它自己的对象数组的“ taskId”和“ resourceId”并将结果推送到一个新的数组中。 这是我的数组

Fatal error: Uncaught SoapFault exception: [ns0:Server] java.lang.NullPointerException in C:\xampp\htdocs\tnt\index.php:27 Stack trace: #0 C:\xampp\htdocs\tnt\index.php(27): SoapClient->__soapCall('calculaFrete', Array) #1 {main} thrown in C:\xampp\htdocs\tnt\index.php on line 27

请帮助我建立此逻辑。感谢您的提前努力。

5 个答案:

答案 0 :(得分:1)

创建一个新方法filterArray来过滤数组。

function filterArray(dataArray, resourceId, taskId){
   return dataArray.filter(item => item.resourceId === resourceId && item.taskId === taskId)
}

数组上的filter方法将遍历dataArray中的每一项,比较resourceIdtaskId的值,如果它们匹配,则将它们推到新数组。这个新数组是从方法返回的。

您现在可以调用此方法进行过滤:

let filteredArray = filterArray(data, 1234, 5001)

filteredArray现在将包含所有带有resourceId = 1234taskId = 5001

的项目

答案 1 :(得分:0)

1-您的JSON数组格式不正确。

2-根据您在注释中的预期结果,基本上,您只需要那些具有多次出现的数据。所以这是您如何获得:

var data = [{
      "resourceId":1234,
      "taskId":5001,
      "taskName":"Test task1"
     },
     {
      "resourceId":1234,
      "taskId":5001,
      "taskName":"Test task2"
    },
    {
     "resourceId":1234,
     "taskId":5002,
     "taskName":"Test task3"
    },
    {
     "resourceId":1234,
     "taskId":5001,
     "taskName":"Test task4"
    },
    {
     "resourceId":5678,
     "taskId":5003,
     "taskName":"Test task5"
    },
    {
     "resourceId":5678,
     "taskId":5004,
     "taskName":"Test task6"
    }
    ];

    const result = [];
    data.forEach((item) => { 
        let dupes = data.filter((elem) => elem.resourceId == item.resourceId && elem.taskId == item.taskId);
        if (dupes.length >1) {
            result.push(item);
        }
    });

    console.log(result);

答案 2 :(得分:0)

data = [{
  "resourceId":1234,
  "taskId":5001,
  "taskName":"Test task1"
 },
 {
  "resourceId":1234,
  "taskId":5001,
  "taskName":"Test task2"
},
{
 "resourceId":1234,
 "taskId":5002,
 "taskName":"Test task3"
},
{
 "resourceId":1234,
 "taskId":5001,
 "taskName":"Test task4"
},
{
 "resourceId":5678,
 "taskId":5003,
 "taskName":"Test task5"
},
{
 "resourceId":5678,
 "taskId":5004,
 "taskName":"Test task6"
}
]
var result=[];
data.map(x=>{
	var i=result.findIndex(y=> y.resourceId==x.resourceId && y.taskId==x.taskId );
	if( i == -1){
		result.push( { "resourceId":x.resourceId,"taskId":x.taskId,"taskName":x.taskName } )
	}else{
		result[i].taskName += " "+x.taskName;
	}
})
console.log(result)

答案 3 :(得分:0)

data = [{
  "resourceId":1234,
  "taskId":5001,
  "taskName":"Test task1"
 },
 {
  "resourceId":1234,
  "taskId":5001,
  "taskName":"Test task2"
},
{
 "resourceId":1234,
 "taskId":5002,
 "taskName":"Test task3"
},
{
 "resourceId":1234,
 "taskId":5001,
 "taskName":"Test task4"
},
{
 "resourceId":5678,
 "taskId":5003,
 "taskName":"Test task5"
},
{
 "resourceId":5678,
 "taskId":5004,
 "taskName":"Test task6"
}
]
var result=[];
data.map(x=>{
	var i=result.findIndex(y=> y.resourceId==x.resourceId && y.taskId==x.taskId );
	if( i == -1){
		result.push( { "resourceId":x.resourceId,"taskId":x.taskId,"taskName":[x.taskName] } )
		
	}else{
		result[i].taskName.push( x.taskName);
	}
})
console.log(result)

答案 4 :(得分:0)

您可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

var result = data.reduce(function (r, a) {
    var value = a.resourceId.toString().concat(a.taskId);
    r[value] = r[value] || [];
    r[value].push(a);
    return r;
}, Object.create(null));

这将产生如下所示的新数组,您可以根据需要修改键名(数组名)

enter image description here

JS小提琴:https://jsfiddle.net/2cpe3ts6/