Замените некоторые значения в массиве объектов большим количеством ключей

У меня есть массив объектов, каждый из которых имеет много ключей (> 200). Некоторые значения этих ключей могут быть "-", "" или "na". Я хочу заменить эти значения на null.

Пример:

[
  {
    "waste ": "",
    "d_f": "-",
    "sa": "  - ",
    "fgdf-h": "na",
    "gdws": "0",
    "ffd ": "121.4",
    " tg": "34",
    "yyy rd": "1,23 ",
    "abd": " 45678",
    "abd": " 4.567,8",
    "edf": " na",
    "first": "-   ",
    ...
  },
  {...},
]

должен стать:

[
  {
    "waste ": null,
    "d_f": null,
    "sa": null,
    "fgdf-h": null,
    "gdws": "0",
    "ffd ": "121.4",
    " tg": "34",
    "yyy rd": "1,23 ",
    "abd": " 45678",
    "abd": " 4.567,8",
    "edf": null,
    "first": null,
    ...
  },
  {...},
]

Это мой код:

function uniformNoData(data) {
  const result = data.map((datum, i) => {
    return Object.values(datum).map(d => {
      // and then ??
    })
    return datum
  })
  return result
}

Я не знаю, как завершить код.. Я хочу новый объект, а не изменять объект данных, поэтому я использовал карту, а не foreach.

Любая помощь приветствуется

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
46
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Используйте цикл forEach для Object.keys и замените значения

var a = [{
  "waste ": "",
  "d_f": "-",
  "sa": "  - ",
  "fgdf-h": "na",
  "gdws": "0",
  "ffd ": "121.4",
  " tg": "34",
  "yyy rd": "1,23 ",
  "abd": " 45678",
  "abd": " 4.567,8",
  "edf": " na",
  "first": "-   ",
}]
var obj = {};
a.forEach((x) => {
  Object.keys(x).forEach((e) => {
    if (x[e].trim() == "na" || x[e].trim() == "-" || x[e].trim() == "")
      obj[e] = null;
    else
      obj[e] = e;
  })
})

console.info(obj)

Я не хочу заменять объект, хочу копию

user7558372 07.02.2019 17:15

Не забудьте нажать кнопку Tidy после редактирования фрагмента.

Barmar 07.02.2019 17:30
Ответ принят как подходящий

Рабочий пример: https://jsfiddle.net/0gdr9t7f/

const badVals = ['-', 'na'];   

const newArr = arr.map(entry => {
    Object
    .keys(entry)
    .forEach(key => {
         const val = entry[key].trim();
         if (!val || badVals.includes(val)) {
            entry[key] = null;
         }
    })
    return entry;
});

Вы можете собрать строки замены в массив и проверить.

var data = [{ "waste ": "", d_f: "-", sa: "  - ", "fgdf-h": "na", gdws: "0", "ffd ": "121.4", " tg": "34", "yyy rd": "1,23 ", abd: " 4.567,8", edf: " na", first: "-   " }],
    nullValues = ['', '-', 'na'],
    result = data.map(o => Object.assign({}, o, ...Object.keys(o).filter(k => nullValues.includes(o[k].trim())).map(k => ({ [k]: null }))));

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Вы не можете использовать для этого Object.values(). Вам нужно перебрать Object.keys(), чтобы у вас был ключ для обновления записи.

function uniformNoData(data) {
  data.map((datum) => {
    datum = clone(datum);
    Object.keys(datum).forEach(key => {
      if (datum[key] == "na" || datum[key] == "-" || datum[key] == "") {
        datum[key] = null;
      }
    });
    return datum;
  })
}

См. Как правильно клонировать объект JavaScript? для различных способов реализации функции clone(), которую я вызвал выше.

Я бы создал массив со значениями, которые следует заменить, а не карту, как вы

const data = [
    {
        "waste ": "",
        "d_f": "-",
        "sa": "  - ",
        "fgdf-h": "na",
        "gdws": "0",
        "ffd ": "121.4",
        " tg": "34",
        "yyy rd": "1,23 ",
        "abd": " 45678",
        "abd": " 4.567,8",
        "edf": " na",
        "first": "-   ",
    },
];

const garbage = ["", "na", "-"];

const cleanData = data.map(e => {
    const obj = {};
    for  (let key in e) {
        obj[key] = garbage.includes(e[key].trim()) ? null : e[key];
    }
    return obj;
});


console.info(cleanData);

Вы можете использовать forEach и шаблон регулярного выражения.

^(|[- ]+|\s*na\s*)$
  • ^ - Начало строки.

  • (|[- ]+|\s*na\s*) - Соответствует пустой строке, строке с - and space, соответствует любому na с любым количеством пробелов в начале и конце.

  • $ - Конец строки.

let obj = { "waste ": "","d_f": "-","sa": "  - ",  "fgdf-h": "na","gdws": "0","ffd ": "121.4"," tg": "34","yyy rd": "1,23 ","abd": " 45678","abd": " 4.567,8","edf": " na","first": "-   ",}
  
let newObj = {}
  
let op = Object.keys(obj).forEach(e=>{
  newObj[e] = /^(|[- ]+|\s*na\s*)$/g.test(obj[e]) ? null : obj[e]
})

console.info(newObj)

Другие вопросы по теме