2017-08-12 7 views
0

Javascriptを:のJavascriptのforEach

$(document).ready(function() { 
    const ores = "../js/json/oreList.json"; 
    const priceURL = "https://esi.tech.ccp.is/latest/markets/prices/?datasource=tranquility"; 

    let oreArray = []; 
    let priceArray = []; 

    let total = 0; 

    // Retrieve list of ores 
    function getOres() { 
     $.getJSON(ores, function(ores) { 

      ores.forEach(function(ore) { 
       total++; 

       if (total === 48) { 
        getPrices(); 
       } 

       oreArray.push(ore); 
      });  
     }); 
    } 

    // Retrieve all items & prices via API 
    function getPrices() { 
     $.getJSON(priceURL, function(prices) { 
      prices.forEach(function(data) { 
       priceArray.push(data); 
       console.log(data); 
      });  
     }); 
    } 

    getOres(); 
}); 

は、最初の関数は、私の.JSONファイルから内部の配列を作成し、第二の機能は、URLからの内部配列を作成します。二番目の配列priceArrayで

{ id: 1234, name: "Title" } 

、オブジェクトは次のようになります:

{ type_id: 1234, average_price: 56.34 } 

マイoreArray 48個のオブジェクトと残念ながら持つオブジェクトは、次のように見える最初の配列oreArrayにおいて

priceArrayには約11,000のオブジェクトがあります。 2つの配列を比較し、IDの一致する新しいオブジェクトを構築することによって、新しい配列を作成する必要があります。

{ id: 1234, name: "Title", average_price: 56.34 } 

基本的に私はトラブルのためのロジックを考え出すことだ:だから、たとえば次のようになりNEWARRAY内のオブジェクト

oreArray内の各オブジェクトに対して
  • を、中に同じID値を持つオブジェクトを見つけますpriceArrayを作成し、両方の配列の値を使用して新しい配列を新しいオブジェクトに追加します。

答えて

1

を移入するためにマージされたオブジェクトを作成する私はそれをこのように行うだろう:

const ores = "../js/json/oreList.json", 
     priceURL = "https://esi.tech.ccp.is/latest/markets/prices/?datasource=tranquility"; 

let oreArray, 
    priceArray, 
    joinedArray = []; 

function getOres() { 
    $.getJSON(ores, function(ores) { 
     oreArray = ores; 
     getPrices(); 
    }); 
} 

function getPrices() { 
    $.getJSON(priceURL, function(prices) { 
     priceArray = prices; 
     joinPrices(); 
    }); 
} 

function joinPrices() { 
    oreArray.forEach(function(ore) { 
     var matchingPrice = getMatchingPrice(ore); 
     if(matchingPrice !== false) { 
      joinedArray.push({ 
       id: ore.id, 
       name: ore.name, 
       average_price: matchingPrice.average_price 
      }); 
     } 
    }); 
} 

function getMatchingPrice(ore) { 
    for(var i=0; i<priceArray.length; i++) { 
     if(priceArray[i].type_id === ore.id) { 
      return priceArray[i]; 
     } 
    } 
    return false; 
} 

getOres(); 
1

私は、この問題にアプローチする良い方法は、平均価格のデータ構造を少し変更することだと思います。

代わりに、各項目がtype_idaverage_priceフィールドを持つ配列、それらを持つのは、キーがtype_idであり、値がaverage_priceある場合、それらを格納するオブジェクトを使用して検討する必要があります。で

prices.forEach(function(data) { 
    priceArray.push(data); 
}); 

を::

は、より具体的には、あなたは置き換えることができ

const pricesMap = {}; 
prices.forEach(price => { 
    pricesMap[price.type_id] = price.average_price 
}); 

そしてoreArrayにループするとき、あなたは単にpricesMap[ore.id]

を参照することにより、各製品の average_priceにアクセスすることができます

あなたはこのJSBinをチェックアウトすることができます:http://jsbin.com/fogayaqexe/edit?js,console

0

小さなjsonをオブジェクトとして変更することをお勧めします。

例: '{"1234":{"id":1234、 "name": "Title"}}}';

var json = '{"1234":{"id": 1234, "name": "Title" }}'; 
oreArray = JSON.parse(json); 
alert(oreArray['1234'].name); // oreArray[priceArraySingle.id].name 

私たちは、priceArray idとoreArrayを簡単に一致させることができます。

あなたは、各oreArr項目をループに reduceを使用して、アキュムレータに必要なデータを収集することができ
1

:使用

var oreArr=[ 
 
    { id: 1234, name: "Title" }, 
 
    { id: 2234, name: "2Title" }, 
 
] 
 
var priceArr= [ 
 
    { type_id: 1234, average_price: 56.34 }, 
 
    { type_id: 2234, average_price: 256.34 }, 
 
    { type_id: 3234, average_price: 56.34 }, 
 
    { type_id: 4234, average_price: 56.34 }, 
 
] 
 

 
var resArr = oreArr.reduce((ac,x) => { 
 
    var priceMatch = priceArr.find(z => z.type_id === x.id) 
 
    if(! priceMatch) 
 
    return ac //bail out if no priceMatch found 
 
    
 
    var res = Object.assign({}, x, priceMatch) 
 
    ac.push(res) 
 
    return ac 
 
},[]) 
 

 
console.log(resArr) 
 

他の方法:

  • arrayFindをチェックします交差点
  • アキュムレータ
関連する問題