【问题标题】:how to aggregate and do validation on array of object JavaScript?如何对对象 JavaScript 数组进行聚合和验证?
【发布时间】:2021-09-24 12:26:13
【问题描述】:

我有一个包含许多对象的数组,我想在某些验证上将两个数组聚合到一个对象中,例如如果同一个键在两个对象中都有值,那么如果一个键仅在单个键中具有值,则输出对象的键值应该为空一个然后值应该出现在输出对象中 和例子:

let userValues = [
                {
                    "userId": "810",
                    "values": {
                        "21866": "Russia",
                        "21867": "Dog",
                        "21868": ""
                    },
                },
                {
                    "userId": "811",
                    "values": {
                        "21866": "UAE",
                        "21867": "",
                        "21868": "cheddar cheese"
                    },
                }
            ]
let aggricagtedValue= {
              "21866": "",
              "21867": "Dog",
              "21868": "cheddar cheese"
          }

【问题讨论】:

  • 从所有提供的解决方案/方法中是否还有问题?

标签: javascript arrays filter ecmascript-5


【解决方案1】:

这种方式可以帮助你:

const data = [
  {
    "userId": "810",
    "values": {
      "21866": "Russia",
      "21867": "Dog",
      "21868": ""
    },
  },
  {
    "userId": "811",
    "values": {
      "21866": "UAE",
      "21867": "",
      "21868": "cheddar cheese"
    },
  }
];

console.log(Object.values(data.reduce((acc, {values}) => {
  Object.keys(values).forEach((key) => {
    if (!acc[key]) acc[key] = {key, values: []};
    if (values[key].length > 0) acc[key].values.push(values[key]);
  });
  return acc;
}, {})).reduce((acc, {key, values}) => {
  const _values = values.filter(item => item.length > 0).filter((value, index, self) => self.indexOf(value) === index);
  acc[key] = _values.length === 1 ? _values[0] : '';
  return acc;
}, {}));

【讨论】:

    【解决方案2】:

    function collectGroupedValues(result, { values }, idx, arr) {
      // main aggregation task ...
      result = Object
        .entries(values)
        .reduce((obj, [key, value]) => {
          // ... which straightforwardly pushes items into an array.
          if (key in obj) {
            obj[key].push(value);
          } else {
            obj[key] = [value];
          }
          return obj;
        }, result);
    
      // finalizing aggregation task ...
      if (idx >= arr.length - 1) {
        result = Object.fromEntries(Object
          .entries(result)
          .map(([key, valueList]) => {
            // ... which sanitizes each array ...
            valueList = valueList
              .filter(value =>
                // (filter empty strings from array)
                value.trim() !== ''
              );
            // ... an on top of the sanitized
            // result does create the final entry.
            return [
              key,
              (valueList.length === 1) ? valueList[0] : '',
            ];
          })
        );
      }
      return result
    }
    let userValues = [{
      "userId": "810",
      "values": {
        "21866": "Russia",
        "21867": "Dog",
        "21868": "",
      },
    }, {
      "userId": "811",
      "values": {
        "21866": "UAE",
        "21867": "",
        "21868": "cheddar cheese",
      },
    }];
    
    console.log({ userValues });
    console.log(userValues.reduce(collectGroupedValues, {}));
    
    userValues.push({
      "userId": "812",
      "values": {
        "21866": "France",
        "21867": "Goat",
        "21868": "fromage",
      }
    });
    
    console.log({ userValues });
    console.log(userValues.reduce(collectGroupedValues, {}));
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2021-11-21
      • 1970-01-01
      • 2018-03-19
      • 2020-02-14
      • 2011-09-17
      • 1970-01-01
      • 2013-01-17
      • 2021-05-30
      相关资源
      最近更新 更多