如何实现基于两个数组创建结果数组的逻辑
How to implement logic to create result array based on two arrays?
我有三个JavaScript数组:
var arr1 = [
{id:32, "isNormal":true},
{id:4, "isNormal":false}},
{id:2, "isNormal":false},
{id:35, "isNormal":true},
{id:44, "isNormal":false}]
var arr2 = [
{id:32, "isNormal":false},
{id:4, "isNormal":false}},
{id:44, "isNormal":true},
{id:35, "isNormal":true},
{id:2, "isNormal":true}]
var arrResult = [
{externalId:32, startDate:currentDateTime, endDate:"null", "isNormal":false},
{externalId:4, startDate:"null", endDate:"null", "isNormal":false}},
{externalId:44, startDate:"null", endDate:"currentDateTime", "isNormal":true},
{externalId:35, startDate:"null", endDate:"null", "isNormal":true},
{externalId:2, startDate:"null", endDate:"currentDateTime", "isNormal":false}]
数组具有相同的 ID。
我需要检查 arr1 中对象的 isNormal 属性与 arr2 中对象的适当属性(具有相同的 id),
如果 arr1.isNormal = true 且 arr2.isNormal = false 写入 arrResult.startDate 当前日期和时间,
如果 arr1.isNormal = false 和 arr2.isNormal = true 写入 arrResult.endDate 当前日期和时间,
否则什么都不做。
这里对应的数组结果对应于 arr1 和 arr2。实现这一点的优雅方式是什么?
为了检查您的isNormals
是否不同,我建议使用 XOR 运算符 ^
。此外,首先对数组进行排序也会很好。
这里有几个例子,你如何做到这一点。
//I've fixed your data, because it is incorrect
var arr1 = [
{id:32, startDate:"null", endDate:"null", "isNormal":true},
{id:4, startDate:"null", endDate:"null", "isNormal":false},
{id:2, startDate:"null", endDate:"null", "isNormal":false},
{id:35, startDate:"null", endDate:"null", "isNormal":true},
{id:44, startDate:"null", endDate:"null", "isNormal":false}]
var arr2 = [
{id:32, startDate:"null", endDate:"null", "isNormal":false},
{id:4, startDate:"null", endDate:"null", "isNormal":false},
{id:44, startDate:"null", endDate:"null", "isNormal":true},
{id:35, startDate:"null", endDate:"null", "isNormal":true},
{id:2, startDate:"null", endDate:"null", "isNormal":true}];
var sortFunction = function(a, b) {
return a.id - b.id;
}
arr1.sort(sortFunction);
arr2.sort(sortFunction);
//This way:
var result = arr2.map(function(v, i) {
var i1 = arr1[i].isNormal,
i2 = v.isNormal,
obj = {id:arr1[i].id, isNormal:v.isNormal};
obj.startDate = i1 ^ i2 && i1 ? 'currentDateTime' : 'null';
obj.endDate = i1 ^ i2 && i2 ? 'currentDateTime' : 'null';
return obj;
});
document.write('First: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
result = [];
for(var i = 0; i < arr1.length; i++) {
var i1 = arr1[i].isNormal,
i2 = arr2[i].isNormal,
obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:arr2[i].isNormal};
if(i1 ^ i2 && i1) {
obj.startDate = 'currentDateTime';
} else if(i1 ^ i2 && i2) {
obj.endDate = 'currentDateTime';
}
result.push(obj);
}
document.write('Second: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
var result = arr2.reduce(function(r, c, i) {
var i1 = arr1[i].isNormal,
i2 = c.isNormal,
obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:c.isNormal};
if(i1 ^ i2 && i1) obj.startDate = 'currentDateTime';
if(i1 ^ i2 && i2) obj.endDate = 'currentDateTime';
return r.push(obj), r;
}, []);
document.write('Third: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
你去...有时最好保持代码简单...
var arrResult = [];
//loop through the two arrays
for (var i=0; i < arr1.length; i++) {
for (var j=0; j < arr2.length; j++) {
if (arr1[i].id == arr2[j].id) {
// if arr1.isNormal = true and arr2.isNormal = false write to arr2.startDate current date and time,
if (arr1[i].isNormal && arr2[j].isNormal == false) {
arrResult.push({externalId: arr1[i].id, startDate:new Date(), endDate:null, "isNormal":false})
}
//if arr1.isNormal = false and arr2.isNormal = true write to arr2.endDate current date and time,
if (arr1[i].isNormal == false && arr2[j].isNormal) {
arrResult.push({externalId: arr1[i].id, startDate:null, endDate:new Date(), "isNormal":true})
}
}
}
}
请耐心等待,我对jQuery不是那么好,但我做了这个JSFiddle。 它可能会对你有所帮助。所以基本上比较两个 id,如果它们相同并且是正常的:真做 A,如果它们是相同的和 isnormal:false 做 B。
var res_arr = [];
for (var i=0; i < arr1.length; i++) {
for (var j=0; j < arr2.length; j++) {
if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == false) {
res_arr.push({id: arr1[i].id, startDate:'currentDateTime', endDate:"null", "isNormal":false})
}
else if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == true) {
res_arr.push({id: arr1[i].id, startDate:"null", endDate:'currentDateTime', "isNormal":true})
}
}
}
相关文章:
- 从多维嵌套json数组创建下拉列表
- 为对象数组创建列表项
- 如何在cycle js中从JSON数组创建组件
- 使用数据数组创建多个类似组件
- 如何在 Angular JS 中从关联数组创建多个复选框
- 如何为给定数组创建跨度列表
- 如何在javascript中使用2个一维数组创建层次结构树
- 从数据对象数组创建折线图
- 从 javascript 数组创建一个 Jquery 数组
- Angular2从数组创建一个列表
- 使用JavaScript's Reduce从对象数组创建数组
- 如何从数组创建 jqtree
- 从字符串数组创建唯一组合数组
- 反应.js通过数组创建循环
- 从数组创建新元素,直到每秒数组为空
- 如何使用其他流的值数组创建流
- JavaScript:从字节数组创建图像资源
- 使用拆分字符串的数组创建一个对象
- 从一组数据或数组创建对象
- 多维数组 - 创建一个表