Javascript 根据一些配置数据转换事件数据

Javascript 根据一些配置数据转换事件数据,javascript,json,algorithm,Javascript,Json,Algorithm,我有一个JSON数组,配置数据 在配置中,数据是有序的 我还有一个JSON,Events data,它有这些状态,但它们不是按顺序排列的。我想根据配置转换以下事件数据 此外,配置的最后一步将有两个条目,对于该条目,呈现状态应该在完成之前出现 我期望的结果是: Events: [ { Status: 'rendered', State: 'step1' }, { Status: 'rendered', State: 'step2' },

我有一个JSON数组,配置数据

在配置中,数据是有序的

我还有一个JSON,Events data,它有这些状态,但它们不是按顺序排列的。我想根据配置转换以下事件数据

此外,配置的最后一步将有两个条目,对于该条目,呈现状态应该在完成之前出现

我期望的结果是:

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);