javascript - 将重复的对象值转换为数组 Javascript

标签 javascript json

我花了几个小时来找到处理这个对象数组的方法:

[
  {
    "value": "foo01",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo02",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo03",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo04",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo03",
    "name": "bar2"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo01",
    "name": "bar2"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo02",
    "name": "bar2"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo04",
    "name": "bar2"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo01",
    "name": "bar3"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo03",
    "name": "bar3"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo04",
    "name": "bar3"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo02",
    "name": "bar3"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo01",
    "name": "bar4"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo02",
    "name": "bar4"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo04",
    "name": "bar4"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo03",
    "name": "bar4"
  }
]

我期望的 JSON 是这样的:

[
  {
    "name":"bar",
    "value":[
      {
        "value": "foo01",
        "Diagnosis_Code": ["Tidak ada"],
        "name": "bar",
      },
      {
        "value": "foo02",
        "Diagnosis_Code": ["Tidak ada"],
        "name": "bar",
      },
      {
        "value": "foo03",
        "Diagnosis_Code": ["Tidak ada"],
        "name": "bar",
      },
      {
        "value": "foo04",
        "Diagnosis_Code": ["Tidak ada"],
        "name": "bar",
      }
    ]
  },
  {
    "name": "bar2",
    "value": [
      {
        "value": "val1",
        "Diagnosis_Code": ["foo03"],
        "name": "bar2",
      },
      {
        "value": "val2",
        "Diagnosis_Code": ["foo01"],
        "name": "bar2",
      },
      {
        "value": "val3",
        "Diagnosis_Code": ["foo02", "foo04"],
        "name": "bar2",
      }
    ]
  },
  {
    "name": "bar3",
    "value":[
      {
        "value": "val1",
        "Diagnosis_Code": ["foo01"],
        "name": "bar3",
      },
      {
        "value": "val2",
        "Diagnosis_Code": ["foo03", "foo04"],
        "name": "bar3",
      },
      {
        "value": "val3",
        "Diagnosis_Code": ["foo02"],
        "name": "bar3",
      },
    ]
  },
  {
    "name": "bar4",
    "value": [
      {
        "value": "val1",
        "Diagnosis_Code": ["foo01", "foo02", "foo04"],
        "name": "bar4",
      },
      {
        "value": "val2",
        "Diagnosis_Code": ["foo03"],
        "name": "bar4",
      },
    ]
  },
]

我想将重复的 name 值放入 Object 中,如果 json 的 Diagnosis_Code 与另一个值相同,则将其放入数组中

我现在使用的代码只是使用 reduce处理 name,但我不知道如何处理 Diagnosis_Code 属性:

var orgArray = [{"value":"foo01","Diagnosis_Code":"Tidak ada","name":"bar"},{"value":"foo02","Diagnosis_Code":"Tidak ada","name":"bar"},{"value":"foo03","Diagnosis_Code":"Tidak ada","name":"bar"},{"value":"foo04","Diagnosis_Code":"Tidak ada","name":"bar"},{"value":"val1","Diagnosis_Code":"foo03","name":"bar2"},{"value":"val2","Diagnosis_Code":"foo01","name":"bar2"},{"value":"val3","Diagnosis_Code":"foo02","name":"bar2"},{"value":"val3","Diagnosis_Code":"foo04","name":"bar2"},{"value":"val1","Diagnosis_Code":"foo01","name":"bar3"},{"value":"val2","Diagnosis_Code":"foo03","name":"bar3"},{"value":"val2","Diagnosis_Code":"foo04","name":"bar3"},{"value":"val3","Diagnosis_Code":"foo02","name":"bar3"},{"value":"val1","Diagnosis_Code":"foo01","name":"bar4"},{"value":"val1","Diagnosis_Code":"foo02","name":"bar4"},{"value":"val1","Diagnosis_Code":"foo04","name":"bar4"},{"value":"val2","Diagnosis_Code":"foo03","name":"bar4"}];

var newArray = orgArray.reduce(function(acc, curr) {
  var findIfNameExist = acc.findIndex(function(item) {
    return item.name === curr.name;
  })
  if (findIfNameExist === -1) {
    let obj = {
      'name': curr.name,
      "value": [curr]
    }
    acc.push(obj)
  } else {
    acc[findIfNameExist].value.push(curr)
  }
  return acc;

}, []);
console.log(newArray)

是否有一种方法可以将重复的 Diagnosis_Code 转换为数组?

最佳答案

这是另一个例子!

首先,我使用 reduce 来减少你的对象,然后,我使用 map 重新映射它以获得预期的格式;)

这可能不是执行此操作的最佳性能方式,但我发现它是更易于维护和可读的方式。

我希望这很清楚并且会对你有所帮助 :D

const input = [
  {
    "value": "foo01",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo02",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo03",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "foo04",
    "Diagnosis_Code": "Tidak ada",
    "name": "bar"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo03",
    "name": "bar2"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo01",
    "name": "bar2"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo02",
    "name": "bar2"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo04",
    "name": "bar2"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo01",
    "name": "bar3"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo03",
    "name": "bar3"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo04",
    "name": "bar3"
  },
  {
    "value": "val3",
    "Diagnosis_Code": "foo02",
    "name": "bar3"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo01",
    "name": "bar4"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo02",
    "name": "bar4"
  },
  {
    "value": "val1",
    "Diagnosis_Code": "foo04",
    "name": "bar4"
  },
  {
    "value": "val2",
    "Diagnosis_Code": "foo03",
    "name": "bar4"
  }
];

// Condensed/reduced object.
let output = input.reduce((accum, item) => {
  if(!accum[item.name]) {
    accum[item.name] = {};
  }
  if(!accum[item.name][item.value]) {
    accum[item.name][item.value] = [];
  }
  accum[item.name][item.value].push(item.Diagnosis_Code);
  accum[item.name][item.value].original = item;
  return accum;
}, {});

// Object remapped to fit your expected format.
output = Object.keys(output).map((itemName) => {
  return {
    'name': itemName,
    'value': Object.keys(output[itemName]).map((valueName) => {
    const patchedOriginalItem = output[itemName][valueName].original;
    patchedOriginalItem['Diagnosis_Code'] = output[itemName][valueName];
      return patchedOriginalItem;
    })
  };
});

console.log(output);

关于javascript - 将重复的对象值转换为数组 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227069/

相关文章:

javascript - AS3 : How do I get dynamic loader URL from LoaderInfo in Event Listener Function?

javascript - AngularJS - 使用命名空间解析 JSON feed

javascript - node.js 中的 http 请求

javascript - 根据表中的另一列更改按钮颜色

ios - 无法将 json 字符串转换为 json 对象

javascript - 来自 api 响应的嵌套值的解析结果

c# - 使用 Newtonsoft dll 将嵌套(n 级)json 反序列化为 C# 对象

javascript - 转换小时、分钟、秒 - 更清晰的代码

javascript - 在 Javascript 中将持续时间加在一起

javascript - 使用 Ajax 以一种形式上传数据和文件?