2017-05-23 1 views
1

배열이 있습니다. 특정 키 값 쌍을 찾고 싶습니다.배열을 통과하여 중복 된 항목을 별도의 배열로 이동

var myObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
    {"name" : "Kanye", "song" : "Fade"}, 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
]; 

내가 원하는 것은이 모양의 두 개의 배열입니다.

var cleanObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
]; 

var duplicateObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Kanye", "song" : "Fade"}, 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
]; 

현재이 모양이 있습니다.

var duplicateObj = []; 
var cleanObj = {}; 

$.map(myObj, function (obj) { 
    var checkDuplicate = myObj.some(function (elem) { 
     return elem.name == obj.name; 
    }); 
    if (checkDuplicate) { 
     var tempObj = { 
      name: obj.name, 
      song: obj.song 
     } 
     duplicateObj.push(tempObj); 
    } else { 
     var tempObj = { 
      name: obj.name, 
      song: obj.song 
     } 
     cleanObj.push(tempObj); 
    } 
}); 

문제는 중복 된 개체의 첫 번째 인스턴스를 이동하지 않는다는 것입니다. 비교 한 사람 만.

중복 된 항목의 첫 번째 인스턴스를 어떻게 이동할 수 있습니까?

미리 감사드립니다.

+1

할 중복은 같은 이름을 공유? –

+0

@NinaScholz 네 그들은 같은 이름을 공유하고 있습니다. 노래 이름이 아닙니다. – BaconJuice

+0

그러나 원하는 결과 배열에서'Kanye' 항목은 cleanObj에도 있지만, 중복 항목의 첫 번째 항목은 포함하고 싶지 않다고 말합니다. –

답변

1

당신은 중복 렌더링, 해시 테이블 및 필터 및 그룹 이름을 사용할 수 있습니다.

var data = [{ name: "Kanye", song: "Jesus Walks" }, { name: "Axel Ross", song: "Thunder Struck" }, { name: "Kate Perry", song: "Superbass" }, { name: "Kanye", song: "Fade" }, { name: "Kanye", song: "Old Kanye" }], 
 
    groups = Object.create(null), 
 
    singles = data.filter(function (o) { 
 
     if (!groups[o.name]) { 
 
      groups[o.name] = [o]; 
 
      return true; 
 
     } 
 
     groups[o.name].push(o); 
 
    }), 
 
    duplicates = Object.keys(groups).reduce(function (r, k) { 
 
     return r.concat(groups[k].length > 1 ? groups[k] : []); 
 
    }, []); 
 

 
console.log(singles); 
 
console.log(duplicates);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

나는 reduce를 사용하여 배열을 반복하고 중복 된 배열과 깨끗한 배열을 포함하는 객체를 만듭니다.

Array.some을 사용하여 깨끗한 배열에 이미이 아티스트가 있는지 확인하고 중복 배열로 밀어 넣을 수 있습니다. 그렇지 않으면 정리 배열로 밀어 넣습니다.

이 내가 중복 배열에이 아티스트를 삽입하고있어 처음 인 경우, 나는 또한 그것을 삽입합니다은 깨끗한 배열의

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 

 
var ans = myObj.reduce((prev,curr)=>{ 
 
    if (!prev.clean.some(item => item.name == curr.name)) { 
 
    prev.clean.push(curr); 
 
    } 
 
    else { 
 
    if (!prev.duplicate.some(item => item.name == curr.name)) { 
 
     prev.duplicate.push(prev.clean.find(item => item.name == curr.name)); 
 
    } 
 
    prev.duplicate.push(curr); 
 
    } 
 
    return prev; 
 
},{duplicate:[], clean:[]}) 
 

 
let duplicate = ans.duplicate; 
 
let clean = ans.clean; 
 

 
console.log(duplicate); 
 
console.log(clean);

0

당신은 속성을 사용할 수있는 항목의 , 배열 프로토 타입의 "필터링"희망이 도움이 :

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 
var singles = []; 
 
var duplicates = []; 
 

 
function exists(valor, onlySingles) { 
 
    var cont = 0; 
 
    for (item in myObj) { 
 
    if (valor.name === myObj[item].name){ 
 
     cont++; 
 
    } 
 
    } 
 
    if (cont > 1) 
 
    return onlySingles ? false : true; 
 
    else 
 
    return onlySingles ? true : false; 
 
} 
 

 
singles = myObj.filter(exists, true); 
 
duplicates = myObj.filter(exists, false); 
 

 

 
console.log("singles:=>"); 
 
console.log(singles); 
 
console.log("duplicates:=>"); 
 
console.log(duplicates);

1

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 
var non_duplicate = []; 
 
var duplicate = []; 
 
var name_array = []; 
 
var dup_names = []; 
 

 
$.each(myObj, function(idx, obj) { 
 
    if ($.inArray(obj.name, name_array) == -1){   
 
    name_array.push(obj.name); 
 
    non_duplicate.push(obj); 
 
    } 
 
    else{ 
 
    dup_names.push(obj.name); 
 
    } 
 
}); 
 

 
dups = $.unique(dup_names); 
 

 
$.each(dups, function(idx1, obj1) { 
 
    $.each(myObj, function(idx2, obj2) { 
 
    if (obj2.name == obj1){   
 
     duplicate.push(obj2); 
 
    } 
 
    }); 
 
}); 
 

 
console.log(non_duplicate); 
 
console.log(duplicate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

하나가 중복되어 첫 번째 하나가 누락됩니다. –

+0

이것은 OP가 기대하는 출력을 생성하지 않습니다. –

0

나는 분리하는 기준으로하는 name가 나타납니다 횟수를 사용합니다.

var myObj = [{ 
 
    "name": "Kanye", 
 
    "song": "Jesus Walks" 
 
    }, 
 
    { 
 
    "name": "Axel Ross", 
 
    "song": "Thunder Struck" 
 
    }, 
 
    { 
 
    "name": "Kate Perry", 
 
    "song": "Superbass" 
 
    }, 
 
    { 
 
    "name": "Kanye", 
 
    "song": "Fade" 
 
    }, 
 
    { 
 
    "name": "Kanye", 
 
    "song": "Old Kanye" 
 
    }, 
 
]; 
 

 
var cleanObj = [], 
 
    duplicateObj = []; 
 
var mNameCount = {}; 
 

 
myObj.forEach(function(obj) { 
 
    if (!mNameCount[obj.name]) { 
 
    mNameCount[obj.name] = 0; 
 
    cleanObj.push(obj); 
 
    } 
 
    mNameCount[obj.name]++; 
 
}); 
 

 
myObj.forEach(function(obj) { 
 
    if (mNameCount[obj.name] > 1) { 
 
    duplicateObj.push(obj); 
 
    } 
 
}); 
 
console.log(cleanObj); 
 
console.log(duplicateObj);

관련 문제