使用lodash将相同的键转换为一个并创建其值的数组

问题描述 投票:1回答:3

我想改造belo input.json文件。我想将所有类别键合并为一个并创建名称数组(如果匹配)。

我正在寻找仅使用lodash或仅使用JS / ES *的解决方案

已经有类似的问题,但大多数涉及两个不同的json。请详细说明解决方案

[
    {
        "category": "Salman Khan",
        "names": "Bhaijan"
    },
    {
        "category": "Salman Khan",
        "names": "Sallu"
    },
    {
        "category": "Salman Khan",
        "names": "Dabangg Khan"
    },
    {
        "category": "Salman Khan",
        "names": "Sultan"
    },
    {
        "category": "Shahrukh Khan",
        "names": "SRK"
    },
    {
        "category": "Shahrukh Khan",
        "names": "King Khan"
    },
    {
        "category": "Akshay Kumar",
        "names": "Khiladi"
    },
    {
        "category": "Akshay Kumar",
        "names": "Akki"
    },
    {
        "category": "Aamir Khan",
        "names": "A.K."
    },
    {
        "category": "Aamir Khan",
        "names": "Mr. Perfectionist"
    },
    {
        "category": "Priyanka Chopra",
        "names": "Piggy Chops"
    },
    {
        "category": "Kareena Kapoor",
        "names": "Bebo"
    }
]

expected json

[
    {
        "category": "Salman Khan",
        "names": ["Bhaijan", "Sallu", "Dabangg Khan", "Sultan"]
    },
    {
        "category": "Shahrukh Khan",
        "names": ["SRK", "King Khan"]
    },
    {
        "category": "Akshay Kumar",
        "names": ["Khiladi", "Akki", "A.K."]
    },
    {
        "category": "Aamir Khan",
        "names": ["Mr. Perfectionist"]
    },
    {
        "category": "Priyanka Chopra",
        "names": ["Piggy Chops"]
    },
    {
        "category": "Kareena Kapoor",
        "names": ["Bebo"]
    }
]
javascript arrays ecmascript-6
3个回答
3
投票

使用Array#reduce函数迭代数组,并检查当前项目名称是否已存在对象。如果是,只需将名称推入其中,如果没有使用当前项目名称创建新对象。

const data = [
    {
        "category": "Salman Khan",
        "names": "Bhaijan"
    },
    {
        "category": "Salman Khan",
        "names": "Sallu"
    },
    {
        "category": "Salman Khan",
        "names": "Dabangg Khan"
    },
    {
        "category": "Salman Khan",
        "names": "Sultan"
    },
    {
        "category": "Shahrukh Khan",
        "names": "SRK"
    },
    {
        "category": "Shahrukh Khan",
        "names": "King Khan"
    },
    {
        "category": "Akshay Kumar",
        "names": "Khiladi"
    },
    {
        "category": "Akshay Kumar",
        "names": "Akki"
    },
    {
        "category": "Aamir Khan",
        "names": "A.K."
    },
    {
        "category": "Aamir Khan",
        "names": "Mr. Perfectionist"
    },
    {
        "category": "Priyanka Chopra",
        "names": "Piggy Chops"
    },
    {
        "category": "Kareena Kapoor",
        "names": "Bebo"
    }
]

const arr = data.reduce((acc, item) => {
  
  const found = acc.find(i => i.category === item.category);
  
  if(found) {
     found.names.push(item.names);
  } else {
     acc.push({category: item.category, names: [item.names]})
  }
  
  return acc;
}, []);

console.log(arr);

0
投票

您可以使用lodash#groupBy,通过category键对集合中的每个对象进行分组,然后使用lodash#map将每个组转换为您喜欢的数组格式。

var result = _(data)
  .groupBy('category')
  .map(function(group, category) {
    return {
      category: category,
      names: _.map(group, 'names')
    };
  })
  .value();

var data = [
    {
        "category": "Salman Khan",
        "names": "Bhaijan"
    },
    {
        "category": "Salman Khan",
        "names": "Sallu"
    },
    {
        "category": "Salman Khan",
        "names": "Dabangg Khan"
    },
    {
        "category": "Salman Khan",
        "names": "Sultan"
    },
    {
        "category": "Shahrukh Khan",
        "names": "SRK"
    },
    {
        "category": "Shahrukh Khan",
        "names": "King Khan"
    },
    {
        "category": "Akshay Kumar",
        "names": "Khiladi"
    },
    {
        "category": "Akshay Kumar",
        "names": "Akki"
    },
    {
        "category": "Aamir Khan",
        "names": "A.K."
    },
    {
        "category": "Aamir Khan",
        "names": "Mr. Perfectionist"
    },
    {
        "category": "Priyanka Chopra",
        "names": "Piggy Chops"
    },
    {
        "category": "Kareena Kapoor",
        "names": "Bebo"
    }
];

var result = _(data)
  .groupBy('category')
  .map(function(group, category) {
    return {
      category: category,
      names: _.map(group, 'names')
    };
  })
  .value();

console.log(result);
.as-console-wrapper{min-height:100%;top:0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

0
投票

这是使用reduce方法的可能解决方案。

const data = [
    {
        "category": "Salman Khan",
        "names": "Bhaijan"
    },
    {
        "category": "Salman Khan",
        "names": "Sallu"
    },
    {
        "category": "Salman Khan",
        "names": "Dabangg Khan"
    },
    {
        "category": "Salman Khan",
        "names": "Sultan"
    },
    {
        "category": "Shahrukh Khan",
        "names": "SRK"
    },
    {
        "category": "Shahrukh Khan",
        "names": "King Khan"
    },
    {
        "category": "Akshay Kumar",
        "names": "Khiladi"
    },
    {
        "category": "Akshay Kumar",
        "names": "Akki"
    },
    {
        "category": "Aamir Khan",
        "names": "A.K."
    },
    {
        "category": "Aamir Khan",
        "names": "Mr. Perfectionist"
    },
    {
        "category": "Priyanka Chopra",
        "names": "Piggy Chops"
    },
    {
        "category": "Kareena Kapoor",
        "names": "Bebo"
    }
];

const resultObject = data.reduce((acc, value) => {
  acc[value.category] = acc[value.category] || [];
  acc[value.category].push(value.names);
  return acc; 
},{});

const results = Object.keys(resultObject).map(key => ({ category: key, names: resultObject[key]}));

console.log(results);
© www.soinside.com 2019 - 2024. All rights reserved.