Отфильтровать массив объектов по тому же ключу, будучи пустым («»)

1

У меня есть массив объектов, которые нужно фильтровать. Это выглядит примерно так:

        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.

  • 0
    что ты уже испробовал?
  • 0
    Добро пожаловать в стек переполнения. Вы найдете это открытое и разделяющее сообщество; однако не тот, который просто делает работу для других. Пожалуйста, сначала попытайтесь решить вопрос и покажите, где вы застряли.
Показать ещё 4 комментария
Теги:
arrays

3 ответа

1
Лучший ответ

Вы можете считать пустые значения для одного и того же ключа и отображать новые объекты без всех свойств 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; }
  • 0
    Tnx за помощь, у меня было похожее решение, но оно слишком сильно зависело от loDash. Я буду использовать ваши как лучшее решение.
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. Основная цель этой функции - убедиться, что мы сливаемся с непустым значением.

0

Вы можете использовать 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)
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню