Javascript-使用映射函数而不是嵌套的for循环反规范化JSON数组

时间:2018-08-07 20:25:03

标签: javascript json dictionary for-loop nested

我正在设法了解地图功能。 这是我的工作代码,并使用嵌套的for循环输出:

var jsonsToAddTo = [
    {'cat':'k1','key2':'a'},
    {'cat':'k1','key2':'b'},
    {'cat':'k2','key2':'a'},
    {'cat':'k2','key2':'b'},
    {'cat':'k3','key2':'a'}
]

var additionalData = [
    {'pk':'k1','key3':'data1'},
    {'pk':'k2','key3':'data2'},
    {'pk':'k3','key3':'data3'},
]

// Adds a key value pair from sourceJson to targetJson based on a matching value
function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
    for(thisJson in targetJsonArray){
        for(thatJson in sourceJsonArray){
            if(targetJsonArray[thisJson][targetKeyToMatch]==sourceJsonArray[thatJson][sourceKeyToMatch]){
                console.log('match');
                targetJsonArray[thisJson][keyToAdd]=sourceJsonArray[thatJson][keyToAdd];
            }
        }
    }
    return targetJsonArray
}

console.log(denormalizeJsonOnKey(jsonsToAddTo,'cat',additionalData,'pk','key3'))

输出:

[ 
    { cat: 'k1', key2: 'a', key3: 'data1' },
    { cat: 'k1', key2: 'b', key3: 'data1' },
    { cat: 'k2', key2: 'a', key3: 'data2' },
    { cat: 'k2', key2: 'b', key3: 'data2' },
    { cat: 'k3', key2: 'a', key3: 'data3' } 
]

我不知道如何使用数组上的map函数处理嵌套。

5 个答案:

答案 0 :(得分:3)

使用ES6可以简化使用Array#find()Object#assign()

var data = [
    {'cat':'k1','key2':'a'},
    {'cat':'k1','key2':'b'},
    {'cat':'k2','key2':'a'},
    {'cat':'k2','key2':'b'},
    {'cat':'k3','key2':'a'}
]

var data2 = [
    {'pk':'k1','key3':'data1'},
    {'pk':'k2','key3':'data2'},
    {'pk':'k3','key3':'data3'},
]

const mergeData= (arr1, arr2, matchKey, filterKey, includeKey)=>{
   arr1.forEach(o => {
      const newObj ={};
      const match = arr2.find(e => e[filterKey] === o[matchKey])
      newObj[includeKey] = match ? match[includeKey] : null;  
      Object.assign(o, newObj);
   });
}

mergeData(data, data2,'cat', 'pk', 'key3')

console.log(data)

答案 1 :(得分:1)

这是一种利用map和对象分布来产生一个新数组的解决方案,并在目标数组的元素中添加了所需的键:

var jsonsToAddTo = [
    {'cat':'k1','key2':'a'},
    {'cat':'k1','key2':'b'},
    {'cat':'k2','key2':'a'},
    {'cat':'k2','key2':'b'},
    {'cat':'k3','key2':'a'}
]

var additionalData = [
    {'pk':'k1','key3':'data1'},
    {'pk':'k2','key3':'data2'},
    {'pk':'k3','key3':'data3'},
]

function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
    return targetJsonArray.map(thisJson => {
        const addObj = sourceJsonArray.find(thatJson => thatJson[sourceKeyToMatch] === thisJson[targetKeyToMatch]);
        return {
            ...thisJson,
            ...addObj ? {[keyToAdd]: addObj[keyToAdd]} : {},
        }
    });
}

console.log(denormalizeJsonOnKey(jsonsToAddTo, 'cat', additionalData, 'pk', 'key3'))

请注意,此解决方案不会更改原始数组,因此,调用函数后,jsonsToAddTo变量将是相同的。如果要替换原件,则始终可以重新分配它:

jsonsToAddTo = denormalizeJsonOnKey(jsonsToAddTo, 'cat', additionalData, 'pk', 'key3')

答案 2 :(得分:0)

var targetJsonArray = jsonsToAddTo.map(function(json, index) {
    additionalData.forEach(function(data) {
        if (data.pk === json.cat) {
            json.key3 = data.key3;
        }
    })
    return json;
})

答案 3 :(得分:0)

尝试一下, 两次迭代都使用maps

var jsonsToAddTo = [{'cat':'k1','key2':'a'},{'cat':'k1','key2':'b'}, 
                   {'cat':'k2','key2':'a'},{'cat':'k2','key2':'b'},    
                   {'cat':'k3','key2':'a'}]


var additionalData = [{'pk':'k1','key3':'data1'},{'pk':'k2','key3':'data2'},{'pk':'k3','key3':'data3'},
]


function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
    
      jsonsToAddTo.map((obj,index)=> {
        additionalData.map((o,idx)=> {  
            if(obj[targetKeyToMatch]==o[sourceKeyToMatch]){
              obj[keyToAdd]=o[keyToAdd];
            }
         })
       })
      return jsonsToAddTo
    }
    console.log(denormalizeJsonOnKey(jsonsToAddTo,'cat',additionalData,'pk','key3'))

答案 4 :(得分:0)

我建议不要为s->top数据集一次构建一个对象映射,而不是在这里嵌套循环为pop_stack_value()中的每个条目迭代整个top数组。首先,请在目标数据集的.map中引用它:

additionalData

以这种方式进行操作应该效率更高,尤其是当您正在处理的数据集相当大时。