【问题标题】:Merge multiple json with the same id合并多个相同id的json
【发布时间】:2017-12-11 09:38:24
【问题描述】:

第一个 json 来自 API,通过 http 调用获取此数据

[
    {
        "clientid": 1,
        "clientname": "facebook",
        "forecasted": 18,
    },
    {
        "clientid": 2,
        "clientname": "youtube",
        "forecasted": 83,
    }
]

我创建第二个 json 来更新第一个 json 上的图像

 [
        {
            "clientid": 1,
            "clientname": "facebook ",
            "img":"images/21747.jpg"
        },
        {
            "clientid": 2,
            "clientname": "youtube",
            "img": "images/youtube.svg"
        },
    ]

现在我需要基于相同的 id 来计算两个 json,并用第二个 json 的图像填充我来自 api 的第一个 json

app.factory('myFactory', function($http){
  return{

    client: function(callback){
        $http({
          method: "GET",
          url: "http://www.erek.co.za/api/..",
          cache:true
        }).then(callback);
    },  
    list: function(callback){
        $http({
          method: "GET",
          url: "data/Client.json",
          cache:true
        }).then(callback);
    } 
  };
});
app.controller('myController', function ($scope, myFactory) {
          myFactory.client(function(response){
              var data = response.data;
              $scope.myClients = data;
          })
          myFactory.list(function (response) {
            var data = response.data;
            $scope.dark = data;
          })
        });

html

<div ng-repeat="client in myClients>
<a href="#{{client.clientid}}" 
  <div class="client-project-panel">
      <div class="client-logo-container">
          <div class="client-logo" >
              <img ng-src="{{dark[$index].img}}" alt="{{client.clientname}}">
           </div>
          <div class="project-forecasted">
             <h2 class="forecasted-value">{{client.forecasted}}%</h2>
             <p>Complete</p>
          </div>
      </div>
  </div>
</a>

【问题讨论】:

    标签: javascript angularjs json angularjs-scope


    【解决方案1】:

    你可以使用Object.assign方法。

    let array1=[ { "clientid": 1, "clientname": "facebook", "forecasted": 18, }, { "clientid": 2, "clientname": "youtube", "forecasted": 83, } ]
    let array2 = [ { "clientid": 1, "clientname": "facebook ", "img":"images/21747.jpg" }, { "clientid": 2, "clientname": "youtube", "img": "images/youtube.svg" } ]
     
    var expected = array1.map(a => Object.assign(a, array2.find(b => b.clientid == a.clientid)));
    console.log(expected);

    【讨论】:

    • 感谢@Alexandru-lonut,它工作正常,但在我的情况下,第一个 json 来自服务器并且在它内部,还有其他价值
    • 为所有值创建一个数组?除了创建两个数组之外别无他法
    • @NelhAmstrong,请提供所需的输出以帮助您。
    【解决方案2】:
    myFactory.client(function(response){
              var data = response.data;
              var clientsData = data;
              // after you fetch the clients get list of images
              myFactory.list(function (response) {
                var data = response.data;
                var clientImages = {}
                for(var i=0;i<data.length;i++){
                    clientImages[data[i].clientid] = data[i].img
                }
                $scope.dark = clientImages
                $scope.myClients = clientsData
              })
    
    })
    

    在您的模板中只需引用{{dark[client.clientid]}}

    您可能希望将 html 包装在 ng-if="myClients" 中,以便仅在获取数据后显示内容

    【讨论】:

    • @thanks a lot mike_t 它工作得很好,正如我所期待的那样
    猜你喜欢
    • 2020-07-28
    • 2023-03-08
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多