js数组里的对象处理取值问题

一个数组里若干个对象

[
  {
    id: 1,
    keyValue: "1:1"
    nameValue: "aws:RequestHeader"
    operateValue: "StringEquals"
  },
 {
    id: 2,
    keyValue: "2:2"
    nameValue: "aws:RequestHeader"
    operateValue: "StringEquals"
  },
 {
    id: 3,
    keyValue: "a:a"
    nameValue: "aws:RequestHeader"
    operateValue: "StringNotEquals"
  }
]

当几个对象做比较的时候,operateValue的值如果一样
就将两个operateValue一样的对象里的keyValue 放在一个对象里
那么最终得到的结果就是

  {
    id: 1, // 任意id都可以
    StringEquals: {"1": "1", "2": "2"},
    StringNotEquals: {"a": "a"}
  }

请问怎么处理?谢谢大佬们了!!

阅读 2.4k
3 个回答

不想自己写分组了,所以这回用了 Lodash,效率可能没原生的高。过程还是先分组,再映射处理。

import _ from "lodash";

const result = _(data).groupBy("operateValue")
    .mapValues(
        list => _(list)
            .map(({ keyValue }) => keyValue.split(":", 2))
            .fromPairs()
            .value()
    )
    .value();

看到你这个问题,我发现我也不会。
但没关系,学习才是正经事,这是我百度解决的,希望对你有帮助:

const data = [
  {
    id: 1,
    keyValue: "1:1",
    nameValue: "aws:RequestHeader",
    operateValue: "StringEquals",
  },
  {
    id: 2,
    keyValue: "2:2",
    nameValue: "aws:RequestHeader",
    operateValue: "StringEquals",
  },
  {
    id: 3,
    keyValue: "a:a",
    nameValue: "aws:RequestHeader",
    operateValue: "StringNotEquals",
  },
];

// 分组: https://blog.csdn.net/mafan121/article/details/83418116
const groupBy = (list) => {
  const groups = {};

  list.forEach((o) => {
    const group = o.operateValue;
    groups[group] = groups[group] || [];
    groups[group].push(o);
  });

  return groups;
};

const group = groupBy(data)
const result = {
  StringEquals: {},
  StringNotEquals: {}
}

group["StringEquals"].forEach((item) => {
  item = item.keyValue.split(':')
  result.StringEquals[item[0]] = item[1]
});
group["StringNotEquals"].forEach((item) => {
  item = item.keyValue.split(':')
  result.StringNotEquals[item[0]] = item[1]
});

console.log(result);
const newObj = arr.reduce((prev, next) => {
                const keyValue = next.keyValue[0]
                if (prev.hasOwnProperty(next.operateValue)) {
                    prev[next.operateValue] = {...prev[next.operateValue], ...{[keyValue]: keyValue}}
                } else {
                    prev[next.operateValue] = {[keyValue]: keyValue}
                }
                return prev
            },{})

这样可还行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题