2016-11-04 7 views
2

における二つの配列から値を組み合わせます私の場合、最終配列は次のようになります。は、私がどのように見えるの配列を持っているJavaScriptの

var data = [{"year":[1980],"weight":[0]}, 
      {"year":[1981],"weight":[3]}, 
      {"year":[1982],"weight":[4]}, 
      {"year":[1983],"weight":[0]}, 
      {"year":[1984],"weight":[0]}, 
      {"year":[1985],"weight":[7]}, 
      {"year":[1986],"weight":[0]}] 

私はこのタスクを2つのステップで実装しました。最初に、7つの要素の長さ(1980年 - 1986年)の空の配列を作成し、各要素を値{"year": $CURRENT_YEAR, "weight": 0}で初期化しました。それから私はdata配列をループ、空の配列に現在の年のインデックスを検索し、現在の値とyearweightフィールドを交換してください。私のコードは下に貼り付けられます。

コードは、よりエレガントな方法に書き直すことができれば、私は疑問に思います。

// Create empty array 
var my_array = [] 
var length = 7 

// 1st step 
year = 1980 
for (var i = 0; i < length; i++) { 
    my_array.push({"year": year, "weight": 0}); 
    year++ 
} 

// 2nd step 
for (var j = 0; j < data.length; j++) { 
    curr_year = data[j]["year"][0]; 
    curr_weight = data[j]["weight"][0] 
    var index = my_array.findIndex(function(item, i) {return item.year === curr_year}) 
    my_array[index] = {"year": curr_year, "weight": curr_weight} 
} 
+0

なぜ[1981]のように、配列内の自分の価値観であり、[3]?あなたはそれらにさらに価値を蓄えようとしていますか?私はあなたのコードが最初のステップでは配列として値を格納していないが、それは部分的には2番目のステップであることがわかります。だから2人のうちの1人が間違っている。あなたのコードコードはそのようには動作しません。 – trincot

+0

"コードをよりエレガントな方法で書き直すことができるのだろうか?" - これがあなたの質問であれば、これは[codereview](http://codereview.stackexchange.com/)に掲載してはいけませんか? – evolutionxbox

+0

まあ、コードは明らかにOPが求めていることをしていないので、質問を本当に言い換えるべきだと思う*「これは結果が得られない(....) (...)どうしたの? " CodeReview用ではありません。 – trincot

答えて

2

は、それはあなたが大規模な入力配列を持っている場合、最初の場所などでのハッシュ(LUT)を設定するのが賢明かもしれないほか.map()ことで、この仕事をするのが最善です。

var data = [{"year":[1981],"weight":[3]}, 
 
      {"year":[1982],"weight":[4]}, 
 
      {"year":[1985],"weight":[7]}], 
 
    lut = data.reduce((p,c) => p[c.year[0]] ? p : (p[c.year[0]] = c, p), {}); 
 
    range = [1980,1986], 
 
    result = Array(range[1]-range[0] + 1).fill() 
 
             .map((_,i) => lut[i+range[0]] ? lut[i+range[0]] : {year: [i+range[0]], weight: [0]}); 
 
console.log(result);

1

あなたは2つのループを組み合わせて、一つのループに

// Create empty array 
var my_array = [] 
var length = 7 


year = 1980 
for (var i = 0; i < length; i++) { 
    // check if there is data for the year 
    var index = data.findIndex(function(item, i) {return item.year === year}); 
    if(index > -1){ //if there is data, use it 
     my_array.push({"year": data[index]["year"][0], "weight": data[index]["weight"][0]}); 
    }else{ //put in default data 
     my_array.push({"year": year, "weight": 0}); 
    } 
    year++; 
} 
1

を両方のステップを行うことができますが、アレイ内の各時間の要素のインデックスを検索し、大規模なデータに悪いパフォーマンスです。あなただけfind()whileループでこれを行うことができ

// Create empty object and fill it with values where keys are years 
var years = {}; 
data.forEach(item => { 
    years[item.year[0]] = item.weight[0]; 
}); 

// Result array with all years 
var result = []; 
var startYear = 1980; 
var endYear = 1986; 

// Generate our result array 
for (var i = startYear; i <= endYear; i++) { 

    // If property for given year (i) exists in "years" object then add it to "result" array 
    // in other case add default object with weight 0 
    var o = years[i] ? { year: [i], weight: [years[i]] } : { year: [i], weight: [0] }; 
    result.push(o); 
} 
1

:私は、次のアルゴリズムを提案することができます。

var data = [{"year":[1981],"weight":[3]},{"year":[1982],"weight":[4]},{"year":[1985],"weight":[7]}]; 
 
        
 
var i = 1980; 
 
var result = []; 
 

 
while(i <= 1986) { 
 
    var find = data.find(e => e.year[0] == i); 
 
    (find) ? result.push(find) : result.push({year: [i], weight: [0]}); 
 
    i++; 
 
} 
 

 
console.log(result)

また、最初の数年間の配列を取得し、その後 indexOf()whileループを使用するように map()を使用することができます。

var data = [{"year":[1981],"weight":[3]},{"year":[1982],"weight":[4]},{"year":[1985],"weight":[7]}]; 
 
      
 
var i = 1980; 
 
var result = []; 
 
var years = data.map(e => e.year[0]); 
 

 
while(i <= 1986) { 
 
    var ind = years.indexOf(i); 
 
    (ind != -1) ? result.push(data[ind]) : result.push({year: [i], weight: [0]}); 
 
    i++; 
 
} 
 

 
console.log(result)

関連する問題