JavaScript:동일한 속성 값을 공유하는 개체의 중복 제거
특정 개체를 기준으로 자르고 싶은 배열이 있습니다.key:value
이 특정 항목당 하나의 개체만 포함하는 배열을 만들고 싶습니다.key:value
쌍. 복제의 어떤 개체가 새 배열에 복사되는지는 중요하지 않습니다.
예를 들어, 저는 다음 항목을 기준으로 트리밍하고 싶다.price
의 특성arrayWithDuplicates
다음 각 값 중 하나만 포함하는 새 어레이를 만듭니다.
var arrayWithDuplicates = [
{"color":"red",
"size": "small",
"custom": {
"inStock": true,
"price": 10
}
},
{"color":"green",
"size": "small",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"blue",
"size": "medium",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"red",
"size": "large",
"custom": {
"inStock": true,
"price": 20
}
}
];
다음과 같이 됩니다.
var trimmedArray = [
{"color":"red",
"size": "small",
"custom": {
"inStock": true,
"price": 10
}
},
{"color":"green",
"size": "small",
"custom": {
"inStock": true,
"price": 30
}
},
{"color":"red",
"size": "large",
"custom": {
"inStock": true,
"price": 20
}
}
];
루프스루하여 실행할 수 있는 JavaScript 또는 Angular 함수가 있습니까?
편집: 필터링할 속성이 다른 속성 내에 중첩되었습니다.
이 함수는 새 값을 반환하여 어레이에서 중복된 값을 제거합니다.
function removeDuplicatesBy(keyFn, array) {
var mySet = new Set();
return array.filter(function(x) {
var key = keyFn(x), isNew = !mySet.has(key);
if (isNew) mySet.add(key);
return isNew;
});
}
var values = [{color: "red"}, {color: "blue"}, {color: "red", number: 2}];
var withoutDuplicates = removeDuplicatesBy(x => x.color, values);
console.log(withoutDuplicates); // [{"color": "red"}, {"color": "blue"}]
그래서 이렇게 쓸 수 있어요.
var arr = removeDuplicatesBy(x => x.custom.price, yourArrayWithDuplicates);
Angular에 내장된 기능은 없다고 생각합니다만, 만드는 것은 어렵지 않습니다.
function removeDuplicates(originalArray, objKey) {
var trimmedArray = [];
var values = [];
var value;
for(var i = 0; i < originalArray.length; i++) {
value = originalArray[i][objKey];
if(values.indexOf(value) === -1) {
trimmedArray.push(originalArray[i]);
values.push(value);
}
}
return trimmedArray;
}
사용방법:
removeDuplicates(arrayWithDuplicates, 'size');
반품:
[
{
"color": "red",
"size": "small"
},
{
"color": "blue",
"size": "medium"
},
{
"color": "red",
"size": "large"
}
]
그리고.
removeDuplicates(arrayWithDuplicates, 'color');
반품:
[
{
"color": "red",
"size": "small"
},
{
"color": "green",
"size": "small"
},
{
"color": "blue",
"size": "medium"
}
]
사용하다Array.filter()
를 사용하여 값을 추적합니다.Object
값이 이미 해시에 포함되어 있는 모든 항목을 필터링합니다.
function trim(arr, key) {
var values = {};
return arr.filter(function(item){
var val = item[key];
var exists = values[val];
values[val] = true;
return !exists;
});
}
이 경우 밑줄을 사용할 수 있습니다.
//by size:
var uSize = _.uniqBy(arrayWithDuplicates, function(p){ return p.size; });
//by custom.price;
var uPrice = _.uniqBy(arrayWithDuplicates, function(p){ return p.custom.price; });
lodash를 사용하여 중복 개체를 제거할 수 있습니다.
import * as _ from 'lodash';
_.uniqBy(data, 'id');
여기 있습니다.id
'는 고유 식별자입니다.
다음 기능을 사용해 보십시오.
function trim(items){
const ids = [];
return items.filter(item => ids.includes(item.id) ? false : ids.push(item.id));
}
사용.lodash
쉽게 걸러낼 수 있다
첫 번째 파라미터는 어레이가 되고 두 번째 파라미터는 중복되는 필드가 됩니다.
_.uniqBy(arrayWithDuplicates, 'color')
고유한 값을 가진 어레이가 반환됩니다.
가장 뛰어난 퍼포먼스는 아니지만 심플한 솔루션:
var unique = [];
duplicates.forEach(function(d) {
var found = false;
unique.forEach(function(u) {
if(u.key == d.key) {
found = true;
}
});
if(!found) {
unique.push(d);
}
});
for (let i = 0; i < arrayWithDuplicates.length; i++) {
for (let j = i + 1; j < arrayWithDuplicates.length; j++) {
if (arrayWithDuplicates[i].name === students[j].name) {
arrayWithDuplicates.splice(i, 1);
}
}
}
this will work perfectly...and this will delete first repeated array.
To delete last repeated array we only have to change
arrayWithDuplicates.splice(i, 1) ; into
arrayWithDuplicates.splice(j, 1);
즉, 사용자가 여러 개체를 처리할 때 이 기능을 수행할 수 있는 기능은 없습니다.또한 중복된 개체를 중복으로 삭제하는 규칙도 없습니다.
이 예에서는, 다음의 것을 삭제합니다.size: small
그러나 루프를 사용하여 이 기능을 구현하려면 어레이를 루프할 때 첫 번째 기능을 포함하고 마지막 기능을 제외해야 합니다.
lodash와 같은 라이브러리를 살펴보고 원하는 동작을 얻기 위해 API 메서드를 조합한 함수를 만드는 것이 매우 가치가 있을 수 있습니다.
다음은 기본 어레이와 필터 식을 사용하여 반환 결과에 연결되기 전에 새 항목이 중복으로 간주되는지 여부를 확인할 수 있는 가능한 솔루션입니다.
var arrayWithDuplicates = [
{"color":"red", "size": "small"},
{"color":"green", "size": "small"},
{"color":"blue", "size": "medium"},
{"color":"red", "size": "large"}
];
var reduce = function(arr, prop) {
var result = [],
filterVal,
filters,
filterByVal = function(n) {
if (n[prop] === filterVal) return true;
};
for (var i = 0; i < arr.length; i++) {
filterVal = arr[i][prop];
filters = result.filter(filterByVal);
if (filters.length === 0) result.push(arr[i]);
}
return result;
};
console.info(reduce(arrayWithDuplicates, 'color'));
여기서 어레이 필터링에 관한 자료를 참조할 수 있습니다.삭제할 항목에 대한 프리퍼런스를 제공해야 할 경우 반환값을 추가하기 전에 추가 속성을 체크하는 추가 파라미터와 로직을 정의할 수 있습니다.
도움이 됐으면 좋겠네요!
여기 타이프 스크립트 방법이 있습니다.
public removeDuplicates(originalArray:any[], prop) {
let newArray = [];
let lookupObject = {};
originalArray.forEach((item, index) => {
lookupObject[originalArray[index][prop]] = originalArray[index];
});
Object.keys(lookupObject).forEach(element => {
newArray.push(lookupObject[element]);
});
return newArray;
}
그리고.
let output = this.removeDuplicates(yourArray,'color');
이것은 Yvemancera의 솔루션에 근거한 또 하나의 「기능」에 지나지 않습니다(자신의 솔루션을 손질하기 시작한 후).또, 현재는 IE 11만을 사용할 수 있기 때문에, ES5는 한정되어 있습니다.
var newArray = RemoveDuplicates(myArray,'Role', 2);
function RemoveDuplicates(array, objKey, rtnType) {
var list = [], values = [], value;
for (var i = 0; i < array.length; i++) {
value = array[i][objKey];
if(values.indexOf(value) === -1){
list.push(array[i]);
values.push(value);
}
}
if(rtnType == 1)
return list;
return values;
};
단일 개체 속성 값을 기준으로 개체를 필터링할 때 모든 어레이가 아닌 대부분의 어레이에서 이 기능이 작동하기를 바랍니다.
언급URL : https://stackoverflow.com/questions/32238602/javascript-remove-duplicates-of-objects-sharing-same-property-value
'programing' 카테고리의 다른 글
respect.js의 상태 변화를 듣는 방법 (0) | 2023.03.29 |
---|---|
Angular UI, Bootstrap Navbar Collapse 및 Javascript (0) | 2023.03.29 |
JS를 반응시키기 위해 추가한 외부 스크립트를 사용하려면 어떻게 해야 합니까? (0) | 2023.03.29 |
Composer/WordPress : wp-content 디렉토리를 커밋해야 합니다. (0) | 2023.03.29 |
연락처 양식 7의 자리 표시자 - Wordpress (0) | 2023.03.29 |