تجميع ثم التصفية

0

لدي كائن أدناه معي.

car = [{
    Acc: "X1",
    primary: true,
    Name: "Park Street",
    Date: "2018/01/01"
},{
    Acc: "X1",
    primary: false,
    Name: "Park Street 2",
    Date: "2018/03/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 3",
    Date: "2018/01/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 4",
    Date: "2018/05/01"
}];

يجب أن أحصل على عنصر واحد فقط من كل مجموعة من "Acc". عنصر واحد لكل من Acc: "X1" و Acc: "X2". يجب أن يكون المنطق للعثور على ذلك إذا كان الأساسي: true ، ثم حدد هذا العنصر من المجموعة الأخرى ، واختر العنصر الذي يحتوي على أحدث تاريخ: القيمة.

أنا أفهم أن هذا الشرط يمكن تحقيقه باستخدام التسطير السفلي js لكني جديد في هذا ولا يمكنني معرفة الطريقة ذات الصلة.

هل هناك احد يساعدني من فضلكم؟

3 الاجابة

2
افضل جواب

إحدى الطرق للقيام بذلك ، هي المجموعة الأولى Acc ، ثم ضمن المجموعة فرز حسب primary & Date تنازليًا ، ثم اختر الأولى من كل مجموعة.

على سبيل المثال.

const car = [{
    Acc: "X1",
    primary: true,
    Name: "Park Street",
    Date: "2018/01/01"
},{
    Acc: "X1",
    primary: false,
    Name: "Park Street 2",
    Date: "2018/03/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 3",
    Date: "2018/01/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 4",
    Date: "2018/05/01"
}];


//lets group
const grouped = car.reduce((a, v) => {
  if (!a[v.Acc]) a[v.Acc] = [];
  a[v.Acc].push(v);
  return a;
}, {});

//now for each group sort by primary, and then Date
const result = Object.values(grouped).map((g) => {
  g.sort((a, b) => b.primary - a.primary || b.Date.localeCompare(a.Date));
  return g[0]; //now sorted, pick first.
});

console.log(result);

طريقة أخرى أكثر كفاءة ، قد تكون فقط لتتبع الأفضل داخل كائن حرفي ..

على سبيل المثال ..

const car = [{
    Acc: "X1",
    primary: true,
    Name: "Park Street",
    Date: "2018/01/01"
},{
    Acc: "X1",
    primary: false,
    Name: "Park Street 2",
    Date: "2018/03/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 3",
    Date: "2018/01/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 4",
    Date: "2018/05/01"
}];

const best = {};

car.forEach((c) => {
  const b = best[c.Acc] = best[c.Acc] || c;
  if (b.primary) return;
  if (c.Date.localeCompare(best.Date) < 0) best[c.Acc] = c;
});

console.log(Object.values(best));

:مؤلف
0

if primary: true, then select that element from the group else pick the one having latest Date: value

حسب البيان أعلاه هناك واحد فقط primary:true في كل مجموعة ( X1 أو X2 ). إذا كان فهمي صحيحًا ، يمكنك تجربة الرمز أدناه :

// Input object
var car = [{
	Acc: "X1",
	primary: true,
	Name: "Park Street",
	Date: "2018/01/01"
}, {
	Acc: "X1",
	primary: false,
	Name: "Park Street 2",
	Date: "2018/03/01"
}, {
	Acc: "X2",
	primary: false,
	Name: "Park Street 3",
	Date: "2018/01/01"
}, {
	Acc: "X2",
	primary: false,
	Name: "Park Street 4",
	Date: "2018/05/01"
}];

// fetch the primary:true objects from the Input array.
var primaryTrueArray = car.filter(obj => {
  if (obj.primary === true) {
    return obj;
  }
});

// filtered out the primary:true objects from the Input array based on the primaryTrueArray.Hence, we will get all primary:false.
var filteredOutPrimaryTrue = car.filter(obj => primaryTrueArray.filter(item => item.Acc != obj.Acc));

// Fetch the latest date from the group who has primary:false from the filteredOutPrimaryTrue.
var latestDateFromGroup = filteredOutPrimaryTrue.sort(function(a,b){
                                   if (a.Date < b.Date)
                                      return 1;
                                   else if (a.Date == b.Date)
                                      return 0;
                                   else
                                      return -1;
                               });
                               
// Concatenate both the arrays "primaryTrueArray & latestDateFromGroup" into single one.                           
var finalResult = primaryTrueArray.concat([latestDateFromGroup[0]]); 

// Desired output.
console.log(finalResult);

:مؤلف
0

نظرًا لأنك ذكرت Underscore ، أفهم أنه يمكنك استخدام مكتبات خارجية. هذا هو نفس النهج الذي اتبعهKeith ، ولكن باستخدام Lodash بدلاً من ذلك.

أيضا ، يجب أن يعمل هذا مع جميع المتصفحات.

var car = [{
    Acc: "X1",
    primary: true,
    Name: "Park Street",
    Date: "2018/01/01"
},{
    Acc: "X1",
    primary: false,
    Name: "Park Street 2",
    Date: "2018/03/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 3",
    Date: "2018/01/01"
},{
    Acc: "X2",
    primary: false,
    Name: "Park Street 4",
    Date: "2018/05/01"
}];

var sorted = _.orderBy(car, ['primary', 'Date'], ['desc', 'desc']);
var groupedSorted = _.groupBy(sorted, 'Acc');
var result = _.flatMap(groupedSorted, function(o) { return o[0]; });
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام