首页 > 解决方案 > 将相同的字段项转换为值数组

问题描述

我正在尝试使用如下键映射数组

const data =    [{
          "_id": "5f0ffb96d67d70c1a3b143e7",
          "name": "USER",
          "type": "CUSTOM",
          "origin": "USER",
          "conditions": [{
            "_id": "5f0ffb96d67d70c1a3b143e8",
            "field": "status",
            "value": "Nomita",
            "operator": "equal"
          }, {
            "_id": "5f0ffb96d67d70c1a3b143e9",
            "field": "current_status",
            "value": "ACTIVE",
            "operator": "equal"
          }, {
            "_id": "5f0ffb96d67d70c1a3b143ea",
            "field": "user_group_uuid",
            "value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
            "operator": "equal"
          }, {
            "_id": "5f0ffb96d67d70c1a3b143eb",
            "field": "user_group_uuid",
            "value": "20348751-dcaa-4227-a0ff-912b27180aee",
            "operator": "equal"
          }]
        }]

以上是输入。

const filters_data = { ...data[0] }
const filters_mapping = (array, keyField) =>
    array.reduce((obj, item) => {
            obj[item[keyField]] = item
            return obj
        }, {})
const filter_items = filters_mapping(filters_data.conditions,'field');

从这段代码中我得到

{ user_status:
   { _id: 5f0ffb96d67d70c1a3b143e8,
     field: 'status',
     value: 'Nomita',
     operator: 'equal' },
  current_status:
   { _id: 5f0ffb96d67d70c1a3b143e9,
     field: 'current_status',
     value: 'ACTIVE',
     operator: 'equal' },
  user_group_uuid:
   { _id: 5f0ffb96d67d70c1a3b143eb,
     field: 'user_group_uuid',
     value: 'd12s0a7c-11ac-7abf-bl03-f0b70e26f8f2',
     operator: 'equal' } }

但我实际上想要这样的东西,value当字段相似时映射 in 数组。

{ user_status:
       { _id: 5f0ffb96d67d70c1a3b143e8,
         field: 'status',
         value: 'Nomita',
         operator: 'equal' },
      current_status:
       { _id: 5f0ffb96d67d70c1a3b143e9,
         field: 'current_status',
         value: 'ACTIVE',
         operator: 'equal' },
      user_group_uuid:
       { _id: 5f0ffb96d67d70c1a3b143eb,
         field: 'user_group_uuid',
         value: ['d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2','20348751-dcaa-4227-a0ff-912b27180aee'],
         operator: 'equal' } }

只有当有多个字段可用时才会发生这种情况,否则,它只会返回普通字符串。

标签: javascriptarraysjson

解决方案


这是一种可能的解决方案。

您的代码不处理密钥已经存在的情况。

const data = [{
  "_id": "5f0ffb96d67d70c1a3b143e7",
  "name": "USER",
  "type": "CUSTOM",
  "origin": "USER",
  "conditions": [{
    "_id": "5f0ffb96d67d70c1a3b143e8",
    "field": "status",
    "value": "Nomita",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143e9",
    "field": "current_status",
    "value": "ACTIVE",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143ea",
    "field": "user_group_uuid",
    "value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143eb",
    "field": "user_group_uuid",
    "value": "20348751-dcaa-4227-a0ff-912b27180aee",
    "operator": "equal"
  }]
}];

const mutatedData = data[0].conditions.reduce((tmp, {
  _id,
  field,
  value,
  operator,
}) => {
  // Handle the case where the field already exists
  if (tmp[field]) {
    tmp[field].value = [
      ...(tmp[field].value instanceof Array ?
        tmp[field].value : [tmp[field].value]),

      value,
    ];

    return tmp;
  }

  // Handle the case where the field doesn't exist yet
  tmp[field] = {
    _id,
    field,
    value,
    operator,
  };

  return tmp;
}, {});


console.log(mutatedData);


精简版

const data = [{
  "_id": "5f0ffb96d67d70c1a3b143e7",
  "name": "USER",
  "type": "CUSTOM",
  "origin": "USER",
  "conditions": [{
    "_id": "5f0ffb96d67d70c1a3b143e8",
    "field": "status",
    "value": "Nomita",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143e9",
    "field": "current_status",
    "value": "ACTIVE",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143ea",
    "field": "user_group_uuid",
    "value": "d12s0a7c-11ac-7abf-bl03-f0b70e26f8f2",
    "operator": "equal"
  }, {
    "_id": "5f0ffb96d67d70c1a3b143eb",
    "field": "user_group_uuid",
    "value": "20348751-dcaa-4227-a0ff-912b27180aee",
    "operator": "equal"
  }]
}];

const mutatedData = data[0].conditions.reduce((tmp, {
  _id,
  field,
  value,
  operator,
}) => (tmp[field] = tmp[field] ? ((tmp[field].value = [
  ...(tmp[field].value instanceof Array ?
    tmp[field].value : [tmp[field].value]),

  value,
]) && tmp[field]) : {
  _id,
  field,
  value,
  operator,
}) && tmp, {});

console.log(mutatedData);


推荐阅读