Возврат подмножества объекта JSON с помощью функции Javascript map()

Мой вопрос заключается в том, есть ли простой способ вернуть подмножество объекта JSON, которое будет содержать все «столбцы», а не указывать по отдельности, какие «столбцы» возвращать.

В частности, у меня есть CSV-файл с несколькими столбцами, преобразованный в JSON. Приведенная ниже функция возвращает подмножество этого объекта — всего два «столбца» (как другой объект), если выполняется определенное условие (в данном случае «Имя» соответствует):

var firstSubArr = json.map(function(s) {
  if (s.Name === RegName) {
    return {
      'Price': s.Price,
      'Name': s.Name
    }
  }
}).filter(function(n) {
  return n !== undefined
});

Есть ли более простой способ вернуть «все столбцы» из объекта json как объект, а не это:

return {'Price':s.Price,'Name':s.Name}?

Комментарий: Это просто простая структура JSON после преобразования из csv, например:

`[
    {Name:'Sydney', Price:123, Type:'xyz', etc. 20 more... },
    etc.
    ]`

Комментарий 2: Да, фильтр может быть вариантом, как предложили несколько человек, но что, если мое условие немного сложнее, например:

    var fullPeriodArr= json.map( function (s) { 
    if (moment(s.Date,"YYYYMMDD").isSameOrBefore(currd) && moment(s.Date,"YYYYMMDD").isSameOrAfter(fullPeriodStart) && (s.Type==sid || s.Type==sid2)&& s.Name===RegName){return [s.Price, s.Name] 
    }
    }).filter( function (n) { 
    return n!== undefined
    });

РЕШЕНИЕ:

Все 3 респондента дали подсказку, спасибо! Это было просто «вернуть каждый объект в массиве объектов, который соответствует условию», или просто:

    var firstSubArr= json.filter( 

s =>  (moment(s.Date,"YYYYMMDD").isSameOrBefore(currd) && moment(s.Date,"YYYYMMDD").isSameOrAfter(fullPeriodStart) && (s.Type==sid  || s.Type==sid2) && s.Name===RegName)

);

. где диапазон времени «от... до» оценивается с использованием библиотеки moment.js, а дата, тип и имя являются ключами объекта.

Секретным пудингом была круглая скобка ( ) вокруг сложного условия.

Каким аккуратным стал Javascript: не нужно ни получать .length, ни зацикливаться с for или while, ни операторы if... else, ни хранить промежуточные результаты, ни return. Стрелка заменяет все это!

Затем вы можете получить доступ, например. «Столбец» цены в виде массива чисел для сводных расчетов (например, сумма значений):


var firstSubArrPrice=firstSubArr.map(t => t.Price );

Не могли бы вы рассказать немного подробнее и добавить, как выглядит json.

Maheer Ali 10.04.2019 14:59

Вы хотите, чтобы это был просто чистый js?

lankovova 10.04.2019 15:01
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
8 175
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Избавьтесь от map() и просто используйте filter(), и в результате вы получите исходные объекты.

var firstSubArr = json.filter(function(s) {
  return s.Name === RegName
});

Объекты JSON не будут иметь опции фильтра, поскольку они не являются массивами.

user37309 10.04.2019 15:06

@user37309 user37309 Нет, ОП не сказал о своей цели. Это массив объектов. поскольку OP уже использовал `map ()`

Maheer Ali 10.04.2019 15:07

@ user37309 - ОП делал map, так что это массив.

Adam 10.04.2019 15:07

Примечание. filter() возвращает новый массив, содержащий элементы, где возвращаемое значение было true.

dpolicastro 10.04.2019 15:08

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

user37309 10.04.2019 15:12

Да, это был хороший совет! Я все еще могу повторно использовать то же сложное условие «если», что и в исходной функции, поэтому, если ответ функции стрелки не может быть переписан, чтобы включить (и сократить?) условие, это будет принятый ответ...

edaus 10.04.2019 15:42

Поскольку вы не использовали функции стрелок и использовали обычные функции, я избегал преобразования. Если вы понимаете функции стрелок, то это простая модификация, чтобы изменить ее самостоятельно.

charlietfl 10.04.2019 15:43

Все еще учусь :-) так как это будет выглядеть, учитывая мой пример комментария 2?

edaus 10.04.2019 15:47

Та же концепция. Переместите условную логику за пределы map() и используйте ее для возврата логического значения в filter(). Можно оставить тот же if () и вернуть true и добавить еще, чтобы вернуть false

charlietfl 10.04.2019 15:48

Как насчет:

var firstSubArr = json.filter( x => x.Name ===RegName)  

Этот ответ по существу идентичен вопросу!

user37309 10.04.2019 15:05

Что ж, поскольку они уже являются объектами, вам просто нужно их отфильтровать. Не понял вопрос ОП.

Oliver 10.04.2019 15:09

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

var firstSubArr = json.reduce((ac,{Name,Price}) => a.Name === RegName ? [...ac,{Name,Price}] : ac, []);

Если вам не нужны только Name,Price и все свойства с вызывающими именами. Тогда используйте filter() отдельно

var firstSubArr = json.filter(x => x.Name === RegName)

Чтобы сделать это в JavaScript, я рекомендую этот код:

var valueNeedly = json.filter(function(s) {
  return s.value === searchValue
});

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