JS + Lodash Фильтр объекта по значению проп - PullRequest
0 голосов
/ 09 октября 2018

Я довольно новичок в JS и использую lodash для проекта.Здесь у меня есть объект объектов, и мне нужно отфильтровать объекты в соответствии со значением реквизита.Я прошел через другое сообщение о переполнении стека, но не смог получить требуемый вывод:

Мой объект выглядит следующим образом:

var parameters = {
  "param_a": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter A", 
    "status": "absolute",
  }, 
  "param_b": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter B", 
    "status": "absolute",
  },
  "param_c": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter C", 
    "status": "relative",
  }, 
}

Мне нужно получить отдельные объекты в соответствии сстатус вроде:

var absolute_parameters = {
  "param_a": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter A", 
    "status": "absolute",
  }, 
  "param_b": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter B", 
    "status": "absolute",
  },
}

var relative_parameters = {
  "param_c": {
    "created": "2018-10-08T05:14:19.498Z", 
    "description": "Description of the Parameter C", 
    "status": "relative",
  },
}

Я пробовал это, но он возвращает исходный объект, как это:

 relative_parameters = _.pickBy(parameters, function(value, key) {return 'relative';})

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

В простом Javascript вы можете взять объект в качестве результирующего набора и назначить объекты в требуемую группу status

var data = { param_a: { created: "2018-10-08T05:14:19.498Z", description: "Description of the Parameter A", status: "absolute" }, param_b: { created: "2018-10-08T05:14:19.498Z", description: "Description of the Parameter B", status: "absolute" }, param_c: { created: "2018-10-08T05:14:19.498Z", description: "Description of the Parameter C", status: "relative" } },
    absolute_parameters = {},
    relative_parameters = {};

Object
    .entries(data)
    .reduce(
        (r, [k, o]) => (Object.assign(r[o.status], { [k]: o }), r),
        { absolute: absolute_parameters, relative: relative_parameters }
    );

console.log(absolute_parameters);
console.log(relative_parameters);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 09 октября 2018

У вас есть помеченный Рамда .Если ответ Рамды приемлем (отказ от ответственности: я автор Рамды), вы можете сделать что-то вроде этого:

const parameters = {"param_a": {"created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter A", "status": "absolute"}, "param_b": {"created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter B", "status": "absolute"}, "param_c": {"created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter C", "status": "relative"}}

const [absolute_parameters, relative_parameters] = 
    R.partition(R.propEq('status', 'absolute'), parameters)

console.log(absolute_parameters)
console.log(relative_parameters)
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

Это зависит от того, в каком поле status всегда есть одно из этих двух значений.Вы также можете создать их независимо, используя filter вместо partition, за счет повторения цикла дважды:

const absolute_parameters = R.filter(R.propEq('status', 'absolute'), parameters)
const relative_parameters = R.filter(R.propEq('status', 'relative'), parameters)
0 голосов
/ 09 октября 2018

Вы можете сделать это с помощью lodash через entries + filter + fromPairs:

var parameters = { "param_a": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter A", "status": "absolute", }, "param_b": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter B", "status": "absolute", }, "param_c": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter C", "status": "relative", }, }

const getByStatus = (s) => _(parameters).entries()
  .filter(([k,{status}]) => _.isEqual(status,s)).fromPairs().value()

console.log(getByStatus('absolute'))
console.log(getByStatus('relative'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

С ES6 вы можете использовать Object.entries + Array.filter + Array.reduce:

var parameters = { "param_a": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter A", "status": "absolute", }, "param_b": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter B", "status": "absolute", }, "param_c": { "created": "2018-10-08T05:14:19.498Z", "description": "Description of the Parameter C", "status": "relative", }, }

const getByStatus = (s) => Object.entries(parameters)
   .filter(([k,{status}]) => status == s).reduce((r,[k,v]) => (r[k]=v,r),{})

console.log(getByStatus('absolute'))
console.log(getByStatus('relative'))
...