как получить ключ и значение объекта, значения которого не равны нулю? - PullRequest
2 голосов
/ 23 апреля 2019

У меня есть объект, который выглядит так:

let data = {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    };

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

Ожидаемый результат должен выглядеть следующим образом:

let newData = {
    toDate: this.state.toDate,
    fromDate: this.state.fromDate,
    options: "negative"
};

Здесь я использовал статический пример объекта data, нулевые значения могут позже отличаться. По сути, я хочу новый объект с парами ключ-значение, значение которых не null. Может кто-нибудь помочь мне с решением?

Ответы [ 6 ]

2 голосов
/ 23 апреля 2019

Вы можете попробовать фильтрацию Object.entries ()

const data = {
  toDate: {},
  fromDate: {},
  filteredEntityText: null,
  options: 'negative',
  searchTerm: null
};

const newData = {};
Object.entries(data)
  .filter(([, value]) => value !== null)
  .forEach(([key, value]) => (newData[key] = value));

console.log(newData);
2 голосов
/ 23 апреля 2019

Вы можете использовать for...in петля

let data = {
  toDate: 'toDate',
  fromDate: 'fromDate',
  filteredEntityText: null,
  options: "negative",
  searchTerm: null
};
let newData = {};
for(var k in data){
  if(data[k] != null)
    newData[k] = data[k];
}
console.log(newData);
1 голос
/ 23 апреля 2019

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

let data = {
  toDate: "abc",
  fromDate: "cde",
  filteredEntityText: null,
  options: "negative",
  searchTerm: null
};

var newObj = Object.keys(data).reduce((acc, el) => {
  // removing all the key-value pairs where value=null
  if(data[el] !== null)
    acc[el] = data[el];
  return acc;
}, {})

console.log('newObj', newObj);
0 голосов
/ 23 апреля 2019

Сначала iterate через этот массив объектов, используя forEach, затем проверьте data.searchTerm !== null.Это рабочее решение.

class App extends React.Component {
  state = {
    toDate: new Date(),
    fromDate: new Date()
  };
  searches = [
    {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    },
    {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: "microsoft"
    },
    {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: "apple"
    }
  ];
  render() {
    let results = [];
    this.searches.forEach(data => {
      if (data.searchTerm !== null) results.push(data);
    });
    console.log(results);
    return (
      <div>
        {results.map((data, index) => (
          <span key={index}>{data.searchTerm}, </span>
        ))}
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root' />
0 голосов
/ 23 апреля 2019

Все это также поможет вам удалить вложенные нулевые элементы.Использование некоторого ES6 / ES2015: ниже приведен пример, в котором будет изменен объект данных напрямую или, если вы захотите создать дублированный объект с удаленными нулями, вы можете вызвать функции, указанные ниже, он вернет новый объект.

Если вам не нравитсясоздайте дополнительную функцию и удалите элементы «inline».

Object.keys(data).forEach(k => (!data[k] && data[k] !== undefined) && delete data[k]);

То же самое, написанное как функция.

const removeEmpty = (data) => {
  Object.keys(data).forEach((k) => (!data[k] && data[k] !== undefined) && delete 
       data[k]);
  return data;
};

Эта функция также использует рекурсию для удаления элементов из вложенных объектов:

const removeEmpty = (data) => {
  Object.keys(data).forEach(k =>
    (data[k] && typeof data[k] === 'object') && removeEmpty(data[k]) ||
    (!data[k] && data[k] !== undefined) && delete data[k]
  );
  return data;
};

То же, что и ранее, но с ES7 / 2016 Object.entries:

const removeEmpty = data => {
  Object.keys(data).forEach(
    k => !data[k] && data[k] !== undefined && delete data[k]
  );
  return data;
};

То же, что и в третьем примере, но в простом ES5:

function removeEmpty(data) {
  Object.keys(data).forEach(function(key) {
    (data[key] && typeof data[key] === 'object') && removeEmpty(data[key]) ||
    (data[key] === '' || data[key] === null) && delete data[key]
  });
  return data;
};
0 голосов
/ 23 апреля 2019

попробуйте

let data = {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    };

  let giveOriginal = (data){
     let originalHolder = {}
     for(let key in data){
        if(data[key]){
           originalHolder[key] = data[key]
         }
      }
    return originalHolder;
  }

 //call giveOriginal 
 giveOriginal(data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...