如何使用lodash链接嵌套的json关系值对象?

时间:2017-08-06 22:11:05

标签: javascript json lodash

我试图分配/合并(真的不知道哪个lodash函数)嵌套的json对象。

我有以下json结构:

{
"sports": [{
        "id": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d",
        "name": "Soccer",
        "slug": "soccer"
    }],
"competitions": [{
        "id": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe",
        "name": "English Premier League",
        "sportId": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d"
    }],
"contests": [{
        "id": "09cee598-7736-4941-b5f5-b26c9da113fc",
        "name": "Super Domingo Ingles",
        "status": "live",
        "competitionId": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe"
    }]
}

我希望获得一个contest对象,并将其关系链接为嵌套。预期的对象是这样的:

{
        "id": "09cee598-7736-4941-b5f5-b26c9da113fc",
        "name": "Super Domingo Ingles",
        "status": "live",
        "competition": {
           "id": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe",
           "name": "English Premier League",
           "sport": {
             "id": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d",
              "name": "Soccer",
              "slug": "soccer"
            }
        }
    }]
}

如何使用lodash完成这种关系?它也可以使用纯JavaScript。

3 个答案:

答案 0 :(得分:0)

您不需要任何特殊的赋值运算符或lodash。您只需使用=即可。

ogObject = {
"sports": [{
        "id": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d",
        "name": "Soccer",
        "slug": "soccer"
    }],
"competitions": [{
        "id": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe",
        "name": "English Premier League",
        "sportId": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d"
    }],
"contests": [{
        "id": "09cee598-7736-4941-b5f5-b26c9da113fc",
        "name": "Super Domingo Ingles",
        "status": "live",
        "competitionId": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe"
    }]
};
newObject = ogObject.contests[0];
for(var i = 0; i<ogObject.competitions.length;i++){
    if(ogObject.competitions[i].id == newObject.competitionId){
        newObject.competition = ogObject.competitions[i];
        for(var j = 0; j<ogObject.sports.length;j++){
            if(ogObject.sports[j].id == newObject.competition.sportId){
                newObject.competition.sport = ogObject.sports[j];
                break;
            }
        }
        break;
    }
}
console.log(newObject)

这可能是lodash内置的,但我对此表示怀疑。它需要预先知道你的架构,以及sportId和sports,competitionId和比赛等之间的关系......

答案 1 :(得分:0)

没有内置的lodash函数可用于展平关系JSON结构。但是这样的事情对你有用:

    const sourceJSON = {
    "sports": [{
            "id": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d",
            "name": "Soccer",
            "slug": "soccer"
        }],
    "competitions": [{
            "id": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe",
            "name": "English Premier League",
            "sportId": "c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d"
        }],
    "contests": [{
            "id": "09cee598-7736-4941-b5f5-b26c9da113fc",
            "name": "Super Domingo Ingles",
            "status": "live",
            "competitionId": "4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe"
        }]
    }

    function findSport(source, sportId) {
    	let sport = _.find(source['sports'], {id: sportId});
    	if(!sport) {
    		return {};
    	}
    
    	return {
    		id: sport.id,
    		name: sport.name,
    		slug: sport.slug,
    	}	
    }
    
    function findCompetition(source, competitionId) {
    	let competition = _.find(source['competitions'], {id: competitionId});
    	if(!competition) {
    		return {};
    	}
    
    	return {
    		id: competition.id,
    		name: competition.name,
    		sport: findSport(source, competition.sportId),
    	}
    }
    
    function flattenContests(source) {
    	return _.map(source['contests'], (contest) => {
    		return {
    			id: contest.id,
    			name: contest.name,
    			status: contest.status,
    			competition: findCompetition(source, contest.competitionId),
    		}
    	});	
    }
    
    console.log(flattenContests(sourceJSON));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

请注意,考虑到原始JSON,展平对象应该是contests的数组(因为contests本身就是一个数组),而不是您期望的单个竞赛对象。

答案 2 :(得分:0)

您真的需要向我们展示您尝试过的内容,以便我们为您提供有关您所遇到的问题的建议,否则您只需要代码编写服务($)。

但是,在ES2016中你可以这样做。

&#13;
&#13;
'use strict';

const obj = {
  sports: [{
    id: 'c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d',
    name: 'Soccer',
    slug: 'soccer',
  }],
  competitions: [{
    id: '4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe',
    name: 'English Premier League',
    sportId: 'c60d0c48-151e-4fa2-bdf8-48cdfa77ad1d',
  }],
  contests: [{
    id: '09cee598-7736-4941-b5f5-b26c9da113fc',
    name: 'Super Domingo Ingles',
    status: 'live',
    competitionId: '4c19ca7c-4d17-46ce-bb4e-e25a4ebe5dbe',
  }],
};

const transformed = obj.contests.map((contest) => {
  const competition = obj.competitions.find(item => item.id === contest.competitionId);
  const sport = obj.sports.find(item => item.id === competition.sportId);
  const sportLevel = { ...sport };
  const competitionLevel = { ...competition, sport: sportLevel };
  delete competitionLevel.sportId;
  const contestLevel = { ...contest, competition: competitionLevel };
  delete contestLevel.competitionId;
  return contestLevel;
});

console.log(JSON.stringify(transformed, null, 2));
&#13;
&#13;
&#13;