![](/img/trans.png)
[英]React - How to compare an filter criteria object with arrays as values to array of objects
[英]How to compare object values in an array of objects?
我正在尝试比较一组对象。 每个对象都有相同的键,但每个键的值不同。 我想创建一个函数来比较每个对象的相似键值对。
我只关心每个对象的质量和位置键,我想将所有对象与这两个键进行比较。
例如,如果对象数组中的第一个和第二个对象包含两个键的相同值,我想创建一个输出对象数组来总结每个分组。
解释:对象一和对象二包含相同的quality
和location
值。 由于第三个对象没有,因此应该创建一个新对象来汇总来自第一个和第二个对象的信息。 该新对象应包含所有水果名称的数组和所有标签的数组。 输出对象如下所示。
// Input
data = [
{
id: '1',
fruit: 'granny smith',
quality: 'good',
location: 'chicago',
tags: ['green', 'sweet'],
},
{
id: '2',
fruit: 'Fuji',
quality: 'good',
location: 'chicago',
tags: ['red', 'tart'],
},
{
id: '3',
fruit: 'gala',
quality: 'bad',
location: 'san diego',
tags: ['tall', 'thin'],
},
];
// Function
function compareObjects(arr) {
const grouped = [];
// Loop over every fruit
const similarObjects = arr.filter((obj, id) => {
// create structure for each common object
let shape = {
id,
fruits: [],
quality: '',
tags: [],
};
arr.forEach((item) => {
// Return a new shape object that contains all fruit names, tags, and quality
if (item.quality == obj.quality && item.location == obj.location) {
shape.id = id;
shape.fruits.push(item.fruit);
shape.fruits.push(obj.fruit);
shape.quality = item.quality;
shape.tags.push(item.tag);
shape.tags.push(obj.tag);
return shape;
}
});
return obj;
});
return similarObjects;
}
console.log(compareObjects(data));
// Output
const output = [
{
id: 'a',
fruits: ['grann smith', 'fuji'],
quality: 'good',
tags: ['green', 'sweet', 'red', 'tart'],
},
...
];
您可以使用Array.prototype.reduce按quality
和location
对data
进行分组,并过滤长度大于 1 的组。
const data = [ { id: "1", fruit: "granny smith", quality: "good", location: "chicago", tags: ["green", "sweet"] }, { id: "2", fruit: "Fuji", quality: "good", location: "chicago", tags: ["red", "tart"] }, { id: "3", fruit: "gala", quality: "bad", location: "san diego", tags: ["tall", "thin"] }, ], output = Object.values( data.reduce((r, d) => { const key = `${d.quality}+${d.location}`; if (!r[key]) { r[key] = { id: d.id, fruits: [], quality: d.quality, location: d.location, tags: [] }; } r[key].fruits.push(d.fruit); r[key].tags.push(...d.tags); return r; }, {}) ).filter((d) => d.fruits.length > 1); console.log(output);
如果您还希望只保留唯一的水果,那么您可以映射结果数组并使用Set
删除重复项。
const data = [ { id: "1", fruit: "granny smith", quality: "good", location: "chicago", tags: ["green", "sweet"] }, { id: "2", fruit: "Fuji", quality: "good", location: "chicago", tags: ["red", "tart"] }, { id: "3", fruit: "gala", quality: "bad", location: "san diego", tags: ["tall", "thin"] }, ], output = Object.values( data.reduce((r, d) => { const key = `${d.quality}+${d.location}`; if (!r[key]) { r[key] = { id: d.id, fruits: [], quality: d.quality, location: d.location, tags: [] }; } r[key].fruits.push(d.fruit); r[key].tags.push(...d.tags); return r; }, {}) ) .filter((d) => d.fruits.length > 1) .map((d) => ({ ...d, fruits: [...new Set(d.fruits)] })); console.log(output);
其他相关文件:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.