Javascript 根据一些配置数据转换事件数据
我有一个JSON数组,配置数据 在配置中,数据是有序的 我还有一个JSON,Events data,它有这些状态,但它们不是按顺序排列的。我想根据配置转换以下事件数据 此外,配置的最后一步将有两个条目,对于该条目,呈现状态应该在完成之前出现 我期望的结果是:Javascript 根据一些配置数据转换事件数据,javascript,json,algorithm,Javascript,Json,Algorithm,我有一个JSON数组,配置数据 在配置中,数据是有序的 我还有一个JSON,Events data,它有这些状态,但它们不是按顺序排列的。我想根据配置转换以下事件数据 此外,配置的最后一步将有两个条目,对于该条目,呈现状态应该在完成之前出现 我期望的结果是: Events: [ { Status: 'rendered', State: 'step1' }, { Status: 'rendered', State: 'step2' },
Events: [
{ Status: 'rendered', State: 'step1' },
{ Status: 'rendered', State: 'step2' },
{ Status: 'rendered', State: 'step3' } ,
{ Status: 'completed', State: 'step3' }
]
PS:到目前为止,我还没有这方面的任何工作/容易出错的代码。基本上,我无法思考如何合并配置以在事件中进行更改
谢谢将config转换为字符串数组,然后在比较该数组中States属性的indexOf差异时使用.sort:
变量配置=[{'state':'step1'}],
[{'state':'step2'}],
[{'state':'step3'}]
];
常量事件=[
{状态:'rendered',状态:'step2'},
{状态:'rendered',状态:'step3'},
{状态:'rendered',状态:'step1'},
{状态:'completed',状态:'step3'}
];
const eventOrders=config.map[{state}]=>state;
Events.sorta,b=>
eventOrders.indexOfa.State-eventOrders.indexOfb.State
||Events.indexOfa-Events.indexOfb
;
console.logEvents 将config转换为字符串数组,然后在比较该数组中States属性的indexOf差异时使用.sort:
变量配置=[{'state':'step1'}],
[{'state':'step2'}],
[{'state':'step3'}]
];
常量事件=[
{状态:'rendered',状态:'step2'},
{状态:'rendered',状态:'step3'},
{状态:'rendered',状态:'step1'},
{状态:'completed',状态:'step3'}
];
const eventOrders=config.map[{state}]=>state;
Events.sorta,b=>
eventOrders.indexOfa.State-eventOrders.indexOfb.State
||Events.indexOfa-Events.indexOfb
;
console.logEvents 您可以在以下步骤中执行此操作 首先从配置中转换数组,如['step1','step2','step3'] 对事件使用排序 然后根据上述数组中项的indexOf State属性对事件中的对象进行排序。 变量配置=[{'state':'step1'}], [{'state':'step2'}], [{'state':'step3'}] ]; 让states=config.mapx=>x[0].state; 常量事件=[ {状态:'rendered',状态:'step2'}, {状态:'rendered',状态:'step3'}, {状态:'rendered',状态:'step1'}, {状态:'completed',状态:'step3'} ] const res=events.sorta,b=>states.indexOfa.State-states.indexOfb.State;
console.logres 您可以在以下步骤中执行此操作 首先从配置中转换数组,如['step1','step2','step3'] 对事件使用排序 然后根据上述数组中项的indexOf State属性对事件中的对象进行排序。 变量配置=[{'state':'step1'}], [{'state':'step2'}], [{'state':'step3'}] ]; 让states=config.mapx=>x[0].state; 常量事件=[ {状态:'rendered',状态:'step2'}, {状态:'rendered',状态:'step3'}, {状态:'rendered',状态:'step1'}, {状态:'completed',状态:'step3'} ] const res=events.sorta,b=>states.indexOfa.State-states.indexOfb.State;
console.logres 它对我有用,希望对你有帮助
function arrangeOrder(arrNeedToArrange, accToArrange, keyOfarrNeedsToArrange, keyOfArrAccToArange) {
let arrangedArr = [];
accToArrange.map((val) => {
let res = arrNeedToArrange.filter(obj => { return obj[keyOfarrNeedsToArrange] == val[0][keyOfArrAccToArange] });
res.map(r => arrangedArr.push(r))
})
return arrangedArr;
}
function setAtLastToObj(arr, key, val) {
let lastObj = {};
arr = arr.filter((obj) => {
if (obj[key] == val) {
lastObj = obj;
}
return obj[key] != val
});
arr.push(lastObj);
return arr;
}
let arr = arrangeOrder(Events, config, 'State', 'state');
arr = setAtLastToObj(arr, 'Status', 'completed');
它对我有用,希望对你有帮助
function arrangeOrder(arrNeedToArrange, accToArrange, keyOfarrNeedsToArrange, keyOfArrAccToArange) {
let arrangedArr = [];
accToArrange.map((val) => {
let res = arrNeedToArrange.filter(obj => { return obj[keyOfarrNeedsToArrange] == val[0][keyOfArrAccToArange] });
res.map(r => arrangedArr.push(r))
})
return arrangedArr;
}
function setAtLastToObj(arr, key, val) {
let lastObj = {};
arr = arr.filter((obj) => {
if (obj[key] == val) {
lastObj = obj;
}
return obj[key] != val
});
arr.push(lastObj);
return arr;
}
let arr = arrangeOrder(Events, config, 'State', 'state');
arr = setAtLastToObj(arr, 'Status', 'completed');
添加了如果状态相同,则在完成之前保持呈现的逻辑
添加了如果状态相同,则在完成之前保持呈现的逻辑
配置无效的“状态”:“step1”应在{}@MaheerAli已更改的配置无效的“状态”:“step1”应在{}@MaheerAli已更改的配置中谢谢您的回答。一旦我用不同的场景评估了您的解决方案。我会接受你的回答。在完成之前保持渲染的逻辑缺失。@是的,我们刚刚观察到了它。您能帮忙吗?@AtulKumar您是专门寻找渲染和完成的排序,还是在渲染和完成的地方可能有其他字符串?@AtulKumar我已经更新了Snow的答案,请检查并确认它是否适用于您的场景。谢谢您的回答。一旦我用不同的场景评估了您的解决方案。我会接受你的回答。在完成之前保持渲染的逻辑缺失。@是的,我们刚刚观察到了它。你能帮忙吗?@AtulKumar你是专门寻找渲染和完成的排序,还是在渲染和完成的地方可能有其他字符串?@AtulKumar我已经更新了Snow的答案,请检查并确认它是否适用于您的场景。这不考虑渲染的最后一步应在完成之前。这不考虑渲染的最后一步应在完成之前。
function arrangeOrder(arrNeedToArrange, accToArrange, keyOfarrNeedsToArrange, keyOfArrAccToArange) {
let arrangedArr = [];
accToArrange.map((val) => {
let res = arrNeedToArrange.filter(obj => { return obj[keyOfarrNeedsToArrange] == val[0][keyOfArrAccToArange] });
res.map(r => arrangedArr.push(r))
})
return arrangedArr;
}
function setAtLastToObj(arr, key, val) {
let lastObj = {};
arr = arr.filter((obj) => {
if (obj[key] == val) {
lastObj = obj;
}
return obj[key] != val
});
arr.push(lastObj);
return arr;
}
let arr = arrangeOrder(Events, config, 'State', 'state');
arr = setAtLastToObj(arr, 'Status', 'completed');
var config = [
[{'state': 'step1'}],
[{'state': 'step2'}],
[{'state': 'step3'}]
];
const Events = [
{ Status: 'rendered', State: 'step2' },
{ Status: 'completed', State: 'step3' },
{ Status: 'rendered', State: 'step1' } ,
{ Status: 'rendered', State: 'step3'}
];
const eventOrders = config.map( ([{state}]) => state);
Events.sort((a, b) => {
let result = eventOrders.indexOf(a.State) - eventOrders.indexOf(b.State);
if(result == 0){
if(a.Status=='rendered' && b.Status=='completed') return -1;
if(b.Status=='rendered' && a.Status=='completed') return 1;
return 0;
}
return result;
});
console.log(Events);