【问题标题】:Javascript group similaritiesJavascript 组的相似之处
【发布时间】:2017-02-20 11:34:49
【问题描述】:

我在 JavaScript JSON 对象中有以下代码:

{
apple: 'value',
orange: 'value',
string1Pear: 'value',
string1Banana: 'value',
string2Pear: 'value',
string2Banana: 'value',
pineapple: 'value'
}

我需要对给定对象的相似键进行分组,而不知道是否存在这样的键或它们的外观。

最终结果应该是这样的:

{
apple: 'value',
orange: 'value',
string: {
   string1: {
      string1Pear: 'value',
      string1Banana: 'value',
   },
   string2: {
      string2Pear: 'value',
      string2Banana: 'value',
   },
}
pineapple: 'value'
}

【问题讨论】:

  • string 会是静态前缀吗?
  • 也许这会给你一个想法:underscorejs.org/#groupBy
  • 不,它可能是任何东西,但它会在一开始就消失。
  • 以及如何处理这个密钥'string1string2Pear'
  • 'string1string2Pear' 永远不会存在

标签: javascript json


【解决方案1】:

使用Object.keys()String.prototype.match()Array.prototype.reduce()函数的解决方案:

var data = { apple: 'value', orange: 'value', string1Pear: 'value', string1Banana: 'value', string2Pear: 'value', string2Banana: 'value', pineapple: 'value'},

    result = Object.keys(data).reduce(function (r, k) {
        var parts = k.match(/(\w+\d+)([A-Z]\w+)/);
        if (!parts) {
            r[k] = data[k];
            return r;
        }
        r[parts[1]] = r[parts[1]] || {};
        r[parts[1]][k] = data[k]
        return r;
    }, {});

console.log(result);

【讨论】:

  • 这太完美了!我只是想知道是否要将所有组嵌套在专用容器中,例如:string {string1: {...}, string2: {...}}?
【解决方案2】:

如果您的键是驼峰式的,并且您希望始终按第一个大写字母之前的任何字符串进行分组,这将起作用:

const fruits = {
      apple: 'value',
      orange: 'value',
      string1Pear: 'value',
      string1Banana: 'value',
      string2Pear: 'value',
      string2Banana: 'value',
      pineapple: 'value'
  }

  // Split by uppercase letters and take the first word.
  function getGroup(key) {
      return key.split(/(?=[A-Z])/)[0];
  }

  // Group keys 
  let newObject = {};
  const keys = Object.keys(fruits);
  
  for (var i = 0; i < keys.length; i++) {
      const key = keys[i];
      const group = getGroup(key);
      
      if (group === key) {
        newObject[group] = fruits[key];
      }
      else if (newObject.hasOwnProperty(group)) {
        newObject[group][key] = fruits[key];
      }
      else {
         newObject[group] = {};
         newObject[group][key] = fruits[key];
      }
  }
  
  console.log(newObject);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多