У меня есть массив объектов, которые нужно фильтровать. Это выглядит примерно так:
let array = [
{
"id": "",
"first_name": "Kary",
"last_name": "Thorndale",
"email": "[email protected]",
"gender": "Female",
"ip_address": "172.152.36.109"
},
{
"id": "",
"first_name": "Westley",
"last_name": "Emmott",
"email": "[email protected]",
"gender": "Male",
"ip_address": "104.62.125.170"
},
{
"id": "",
"first_name": "Gavrielle",
"last_name": "Danihel",
"email": "[email protected]",
"gender": "Female",
"ip_address": "98.98.209.17"
}
];
У меня есть только одно условие - если ключ во всех объектах пуст, удалите его со всех объектов.
Я могу использовать jQuery или loDash, если он быстрее или есть необходимость в нем.
В массиве не должно быть более 15-20 объектов, и до 15 таких массивов, которые должны пройти через фильтр, должно быть до 15.
Вы можете считать пустые значения для одного и того же ключа и отображать новые объекты без всех свойств emty.
var array = [{ id: "", first_name: "Kary", last_name: "Thorndale", email: "[email protected]", gender: "Female", ip_address: "172.152.36.109" }, { id: "", first_name: "Westley", last_name: "Emmott", email: "[email protected]", gender: "Male", ip_address: "104.62.125.170" }, { id: "", first_name: "Gavrielle", last_name: "Danihel", email: "[email protected]", gender: "Female", ip_address: "98.98.209.17" }],
keys = Array
.from(array.reduce((m, o) => {
Object.entries(o).forEach(([k, v]) => m.set(k, (m.get(k) || 0) + +!!v));
return m;
}, new Map))
.filter(({ 1: v }) => v)
.map(([k]) => k),
result = array.map(o => Object.assign(...keys.map(k => ({ [k]: o[k] }))));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Немного лучшая версия с Set
var array = [{ id: "", first_name: "Kary", last_name: "Thorndale", email: "[email protected]", gender: "Female", ip_address: "172.152.36.109" }, { id: "", first_name: "Westley", last_name: "Emmott", email: "[email protected]", gender: "Male", ip_address: "104.62.125.170" }, { id: "", first_name: "Gavrielle", last_name: "Danihel", email: "[email protected]", gender: "Female", ip_address: "98.98.209.17" }],
keys = Array.from(
array.reduce(
(s, o) => Object.entries(o).reduce((t, [k, v]) => v ? t.add(k) : t, s),
new Set
)
),
result = array.map(o => Object.assign(...keys.map(k => ({ [k]: o[k] }))));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вот краткое решение с lodash.
let data = [ { "id": "", "first_name": "Kary", "last_name": "Thorndale", "email": "[email protected]", "gender": "Female", "ip_address": "172.152.36.109" }, { "id": "", "first_name": "Westley", "last_name": "Emmott", "email": "[email protected]", "gender": "Male", "ip_address": "104.62.125.170" }, { "id": "", "first_name": "Gavrielle", "last_name": "Danihel", "email": "[email protected]", "gender": "Female", "ip_address": "98.98.209.17" } ];
const mrg = (r,c) => _.mergeWith(r,c, (o,s) => _.isEmpty(o) ? s : o)
const result = _.map(data, x =>
_.omit(x,_.chain(data).reduce(mrg).pickBy(_.isEmpty).keys().value()))
console.log(result)
<script src="/lodash.min.js"></script>
Основная идея здесь состоит в том, чтобы объединить все объекты в один, так как мы сразу узнаем, какой ключ пуст везде. Мы делаем это с mrg
функции mrg
которая внутри использует mergeWith для предоставления customizer
. Основная цель этой функции - убедиться, что мы сливаемся с непустым значением.
Вы можете использовать findIndex
чтобы проверить, существует ли пустая строка в качестве значения для этого конкретного ключа. Если это -1
то этот ключ не имеет пустой строки в качестве значения.
Если он не больше -1
вы можете использовать map
для возврата нового массива и внутри функции обратного вызова создать новый объект и установить ключ и его значение
let array = [{
"id": "",
"first_name": "Kary",
"last_name": "Thorndale",
"email": "[email protected]",
"gender": "Female",
"ip_address": "172.152.36.109"
},
{
"id": "",
"first_name": "Westley",
"last_name": "Emmott",
"email": "[email protected]",
"gender": "Male",
"ip_address": "104.62.125.170"
},
{
"id": "",
"first_name": "Gavrielle",
"last_name": "Danihel",
"email": "[email protected]",
"gender": "Female",
"ip_address": "98.98.209.17"
}
];
let getIndex = array.findIndex(function(item) {
return item.id === '';
})
let newArray = [];
if (getIndex !== -1) {
newArray = array.map(function(item) {
return Object.assign({}, {
"first_name": item['first_name'],
"last_name": item['last_name'],
"email": item['email'],
"gender": item['gender'],
"ip_address": item['ip_address'],
"item.gender": item['item.gender']
})
})
}
console.log(newArray)
В качестве альтернативы вы можете использовать массив some
& reduce
let array = [{
"id": "",
"first_name": "Kary",
"last_name": "Thorndale",
"email": "[email protected]",
"gender": "Female",
"ip_address": "172.152.36.109"
},
{
"id": "",
"first_name": "Westley",
"last_name": "Emmott",
"email": "[email protected]",
"gender": "Male",
"ip_address": "104.62.125.170"
},
{
"id": "",
"first_name": "Gavrielle",
"last_name": "Danihel",
"email": "[email protected]",
"gender": "Female",
"ip_address": "98.98.209.17"
}
];
let __e = array.some((item) => {
return item.id === '';
})
if (__e) {
let z = array.reduce(function(acc, curr) {
let k = Object.assign({}, curr);
delete k['id'];
acc.push(k);
return acc
}, [])
console.log(z)
}