Фильтр Javascript без объекта JSON - PullRequest
3 голосов
/ 21 мая 2019

Я пытаюсь отфильтровать не массив JSON-объекта как следующий фрагмент

const filter = { filterRows: ['one'] };

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three',
  },
}

const filterDialogView = filter.filterRows;
const filterTemplateMapper = [templateMapper].filter(row => !filterDialogView.includes(row));
console.log(filterTemplateMapper);

Но это не фильтрация

Я получаю следующий вывод

[
  {
    "one": {
    "title": "one"
  },
  "two": {
    "title": "two"
  },
  "three": {
    "title": "three"
  }
 }
]

Желание вывод

 {
  "two": {
    "title": "two"
  },
  "three": {
    "title": "three"
  }
 }

Я хочу фильтровать строки на основе filterRows, например, если filterRows содержит one, как указано выше JSON, тогда one следует удалить из templateMapper

Ответы [ 7 ]

4 голосов
/ 21 мая 2019

Вы можете использовать Object.fromEntries , чтобы построить объект обратно из отфильтрованных записей

Вот идея: -

  • Сначала получите записи из шаблона объекта
  • Фильтруйте записи по значению фильтра
  • Используйте Object.fromEntries для создания объекта изотфильтрованные записи

const filter = { filterRows: ['one'] };

const template = {'one': {title: 'one',},'two': {title: 'two',},'three': {title: 'three',}}

const filterDialogView = filter.filterRows;
const final = Object.entries(template).filter(([row])=> !filterDialogView.includes(row))
console.log(Object.fromEntries(final));

Если ваша среда не поддерживает Object.fromEntries, вы можете использовать это

const filter = { filterRows: ['one'] };

const template = {'one': {title: 'one',},'two': {title: 'two',},'three': {title: 'three',}}

const filterDialogView = filter.filterRows;
const final = Object.entries(template).filter(([row])=> !filterDialogView.includes(row))

const output = final.reduce((op,[key,value])=>{
  op[key] = value
  return op
},{})
console.log(output);
2 голосов
/ 21 мая 2019

Вы можете filter entries объекта в первую очередь. Затем используйте Object.fromEntries() для создания нового объекта из этих отфильтрованных записей.

const filter = { filterRows: ['one'] };

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three',
  },
}

const filteredObject = Object.fromEntries(
    Object.entries(templateMapper).filter(([k]) => !filter.filterRows.includes(k))
)

console.log(filteredObject)
1 голос
/ 21 мая 2019

Один из вариантов - создать копию объекта templateMapper, затем выполнить итерацию по filterRows и удалить каждый связанный ключ:

const filter = {
  filterRows: ['one']
};

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three',
  },
};


const filterTemplateMapper = { ...templateMapper };
filter.filterRows.forEach((key) => {
  delete filterTemplateMapper[key];
});
console.log(filterTemplateMapper);

(также, как отмечается в комментариях, Не существует такого понятия, как "объект JSON" )

0 голосов
/ 21 мая 2019

Вы можете использовать этот способ:

const filter = { filterRows: ['one'] };

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three',
  },
}

// Convert object templateMapper to array with key
const keyArrayTemplateMapper = Object.keys(templateMapper);

// Filter key array
const filterKey = keyArrayTemplateMapper.filter(key => !filter.filterRows.includes(key));

// Using reduce method to return new array
const output = filterKey.reduce((obj, key) => {
    obj[key] = templateMapper[key];
    return obj;
  }, {});

console.log(output);
0 голосов
/ 21 мая 2019

Функция filter() доступна только для массивов. Чтобы получить такое же поведение с объектом, вам нужно использовать объект entries().

const filter = {
  filterRows: ['one']
}

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three',
  },
}

const filteredMapper = Object.entries(templateMapper).reduce((acc, [key, value]) => {
  // if the key is not in the filtered list, add this entry to the object
  if (!filter.filterRows.includes(key)) {
    acc[key] = value
  }

  return acc
}, {}) // pass in empty object as initial value of accumulator

console.log(filteredMapper)

Способ, которым это работает, заключается в том, что мы сначала получаем entries (пары ключ / значение) из templateMapper. Затем мы берем эти записи и reduce их. Редукция принимает несколько аргументов, включая «аккумулятор», который собирает поля, которые мы хотим сохранить. Мы «деструктурируем» key и value, чтобы мы могли проверить, есть ли ключ в списке фильтров. Если он не собирается фильтроваться, мы добавляем его в аккумулятор. Затем мы возвращаем аккумулятор для следующей итерации приведения. Наконец, мы передаем пустой объект в качестве начального значения для аккумулятора на первой итерации.

0 голосов
/ 21 мая 2019

Вместо изменения исходного объекта создайте его копию и удалите ненужные ключи. Для удаления вы можете использовать ключевое слово delete. Выполните итерацию массива filterRows, а затем используйте delete для удаления ключей из скопированного объекта

const filter = {
  filterRows: ['one']
};

const templateMapper = {
  'one': {
    title: 'one',
  },
  'two': {
    title: 'two',
  },
  'three': {
    title: 'three'
  },
}


let newObj = JSON.parse(JSON.stringify(templateMapper));
filter.filterRows.forEach(function(item) {
  if (newObj.hasOwnProperty(item)) {
    delete newObj[item]
  }
});
console.log(newObj)
0 голосов
/ 21 мая 2019

Вы можете filter() объектов.Вы должны filter() записи объекта и затем снова преобразовать его в объект, используя Object.fromEntries()

const filter = { filterRows: ['one'] };

const templateMapper = { 'one': { title: 'one', }, 'two': { title: 'two', }, 'three': { title: 'three', }, }

const filterDialogView = filter.filterRows;
const filterTemplateMapper = Object.fromEntries(
             Object.entries(templateMapper)
                   .filter(row => !filterDialogView.includes(row[0].title))
             );
console.log(filterTemplateMapper);

Если Object.fromEntries() не поддерживается вашим браузером, используйте reduce()

const filter = { filterRows: ['one'] };

const templateMapper = { 'one': { title: 'one', }, 'two': { title: 'two', }, 'three': { title: 'three', }, }

const filterDialogView = filter.filterRows;
const filterTemplateMapper = Object.entries(templateMapper)
                   .filter(row =>!filterDialogView.includes(row[0].title))
                   .reduce((ac,[k,v]) => (ac[k] = v,ac),{});
console.log(filterTemplateMapper);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...