Мой вопрос заключается в том, есть ли простой способ вернуть подмножество объекта 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 );
Вы хотите, чтобы это был просто чистый js?
Избавьтесь от map()
и просто используйте filter()
, и в результате вы получите исходные объекты.
var firstSubArr = json.filter(function(s) {
return s.Name === RegName
});
Объекты JSON не будут иметь опции фильтра, поскольку они не являются массивами.
@user37309 user37309 Нет, ОП не сказал о своей цели. Это массив объектов. поскольку OP уже использовал `map ()`
@ user37309 - ОП делал map
, так что это массив.
Примечание. filter()
возвращает новый массив, содержащий элементы, где возвращаемое значение было true
.
Справедливо - я думаю, что он пытался отфильтровать объект, хотя и с определенным набором ключей.
Да, это был хороший совет! Я все еще могу повторно использовать то же сложное условие «если», что и в исходной функции, поэтому, если ответ функции стрелки не может быть переписан, чтобы включить (и сократить?) условие, это будет принятый ответ...
Поскольку вы не использовали функции стрелок и использовали обычные функции, я избегал преобразования. Если вы понимаете функции стрелок, то это простая модификация, чтобы изменить ее самостоятельно.
Все еще учусь :-) так как это будет выглядеть, учитывая мой пример комментария 2?
Та же концепция. Переместите условную логику за пределы map()
и используйте ее для возврата логического значения в filter()
. Можно оставить тот же if ()
и вернуть true и добавить еще, чтобы вернуть false
Как насчет:
var firstSubArr = json.filter( x => x.Name ===RegName)
Этот ответ по существу идентичен вопросу!
Что ж, поскольку они уже являются объектами, вам просто нужно их отфильтровать. Не понял вопрос ОП.
Я понял, что вы хотите вернуть объект с определенными свойствами, которые соответствуют условию. Вы можете сделать это, используя 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
});
Не могли бы вы рассказать немного подробнее и добавить, как выглядит
json
.