2016-11-04 2 views
2

에 두 배열에서 값을 결합 :내가처럼 보이는 배열이 자바 스크립트

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

내 데이터 시리즈는 올해 1980 년에 시작하여 올해로 끝을 1986 년 내 작업이 입력되는 배열에 모든 누락 된 값; 내 경우 최종 배열은 다음과 같아야합니다.

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]}] 

이 작업을 두 단계로 구현했습니다. 먼저 길이가 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]? 당신은 그들에 더 많은 가치를 저장하려고합니까? 귀하의 코드는 첫 번째 단계에서는 값을 배열로 저장하지 않지만 두 번째 부분에서는 부분적으로 저장합니다. 따라서 둘 중 하나가 잘못되었습니다. 코드 코드는 그렇게 작동하지 않습니다. – 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

당신은이 개 루프를 결합 할 수 있습니다 때마다 큰 데이터에 대한 나쁜 성능 하나 개 루프에서 배열의 요소의

// 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

찾기 인덱스를 두 단계를 수행하십시오.

// 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

당신은 단지 find()while 루프이 작업을 수행 할 수 있습니다 : 나는 다음과 같은 알고리즘을 제안 할 수 있습니다.

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)

관련 문제