Javascript-使用map函数而不是嵌套for循环对JSON数组进行非规范化

Javascript-使用map函数而不是嵌套for循环对JSON数组进行非规范化,javascript,json,dictionary,for-loop,nested,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':'d

我正试着了解地图的功能。 以下是使用嵌套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函数处理嵌套。

使用ES6可以简化使用
array\find()
Object\assign()

var targetJsonArray = jsonsToAddTo.map(function(json, index) {
    additionalData.forEach(function(data) {
        if (data.pk === json.cat) {
            json.key3 = data.key3;
        }
    })
    return json;
})
var数据=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
变量数据2=[
{'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]:空;
赋值对象(o,newObj);
});
}
合并数据(数据、数据2、'cat'、'pk'、'key3')

console.log(数据)
使用ES6可以简化使用
数组#查找()
对象#分配()

var数据=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
变量数据2=[
{'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]:空;
赋值对象(o,newObj);
});
}
合并数据(数据、数据2、'cat'、'pk'、'key3')
console.log(数据)
试试这个, 使用
映射
进行两次迭代

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'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
jsonsToAddTo.map((对象,索引)=>{
additionalData.map((o,idx)=>{
如果(obj[targetKeyToMatch]==o[sourceKeyToMatch]){
obj[keyToAdd]=o[keyToAdd];
}
})
})
返回jsonsToAddTo
}
log(非规范化jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
试试这个, 使用
映射
进行两次迭代

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'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
jsonsToAddTo.map((对象,索引)=>{
additionalData.map((o,idx)=>{
如果(obj[targetKeyToMatch]==o[sourceKeyToMatch]){
obj[keyToAdd]=o[keyToAdd];
}
})
})
返回jsonsToAddTo
}

log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
这是一个解决方案,它利用
map
和对象扩展生成一个新数组,将所需的键添加到目标数组的元素中:

var jsonsToAddTo=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var附加数据=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
返回targetJsonArray.map(thisJson=>{
const addObj=sourceJsonArray.find(thatJson=>thatJson[sourceKeyToMatch]==thisJson[targetKeyToMatch]);
返回{
…这个JSON,
…addObj?{[keyToAdd]:addObj[keyToAdd]}:{},
}
});
}

console.log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
这是一个解决方案,它利用
map
和对象扩展生成一个新数组,并将所需的键添加到目标数组的元素中:

var jsonsToAddTo=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var附加数据=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
返回targetJsonArray.map(thisJson=>{
const addObj=sourceJsonArray.find(thatJson=>thatJson[sourceKeyToMatch]==thisJson[targetKeyToMatch]);
返回{
…这个JSON,
…addObj?{[keyToAdd]:addObj[keyToAdd]}:{},
}
});
}

log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
而不是在这里嵌套循环,它将为
jsonsToAddTo
中的每个条目迭代整个
additionalData
数组,我建议在开始时为
additionalData
dataset构建一个对象映射,然后在目标数据集的.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'},
]

// Adds a key value pair from sourceJson to targetJson based on a matching value
function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
    // Build an object of items keyed on sourceKeyToMatch
    const sourceJsonMap = sourceJsonArray.reduce((obj, item) => (obj[item[sourceKeyToMatch]]=item, obj), {});
    return targetJsonArray.map(item => {
        const targetValue = item[targetKeyToMatch];
        if (sourceJsonMap.hasOwnProperty(targetValue)) {
        item[keyToAdd] = sourceJsonMap[targetValue][keyToAdd];
      }
      return item;
    });
}

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

这样做应该效率更高,尤其是当您正在处理的数据集相当大时。

而不是在此处嵌套循环,它将对
jsonsToAddTo
中的每个条目迭代整个
附加数据数组,我建议在开始时为
附加数据
数据集构建一个对象映射,然后