Как создать новый массив json из 2 массивов с условием в JavaScript? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть данные первого образца

[{start : 1,end : 10 },
{start : 11,end : 20 },
{start : 21,end : 30 }]

И данные второго образца

[{weight : 7,price : 20 },
  {weight : 8 ,price : 10},
  {weight : 11 ,price : 14}]

Я пытаюсь использовать для l oop в моем образце и проверить, является ли вес между тем, что начало и конец. Например, если 'weight: 7, price: 20' из второй выборки находится между 'start: 1, end: 10' первой выборки, то будет 1, а sumPrice будет 20.

И затем l oop с 'weight: 8', price: 10, count будет 1 + 1, а sumPrice составляет 20 + 10 с первого раза l oop. Затем сделайте то же самое.

Мой ожидаемый результат будет таким:

[{ start : 1,end : 10 ,count : 2 , sumPrice :  30},
{ start : 11,end : 20 ,count : 1 , sumPrice :  14 },
{ start : 21,end : 30 ,count : 0 , sumPrice :  0  }]

PS Извините за мой навык Engli sh, и я новичок в javascript. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

использовать jsLinq lib

много полезных методов здесь https://github.com/battousai999/js-linq

window.onload = function() {
  for (var i in ranges) {
    var range = ranges[i];
    
    // conditions
    var matchedItems = $linq(arr).where(r => r.weight >= range.start 
                                          && r.weight <= range.end
                                       ).toArray();

    // count matched
    var count = $linq(matchedItems).count(); 

    // sum price prop.
    var sum = $linq(matchedItems).sum(c => c.price); 

    range.count = count;
    range.sumPrice = sum;
  }

  console.log(ranges);
};


var ranges = [{_id : 1 , start : 1,end : 10 },
{_id : 2 , start : 11,end : 20 },
{_id : 3 , start : 21,end : 30 }];

var arr = [{weight : 7,price : 20 },
  {weight : 11 ,price : 10},
  {weight : 8 ,price : 14}];
<script src="https://cdn.jsdelivr.net/npm/js-linq@1.6.0/jslinq.min.js"></script>
1 голос
/ 05 февраля 2020

Здесь вы хотите map над вашим условным массивом, а затем reduce вашим массивом данных.

const arr1 = [{_id : 1 , start : 1,end : 10 },
  {_id : 2 , start : 11,end : 20 },
  {_id : 3 , start : 21,end : 30 }];

const arr2 = [{weight : 7,price : 20 },
  {weight : 11 ,price : 10},
  {weight : 8 ,price : 14}];



const result = arr1.map((condition) => {
    return arr2.reduce((acc, curr) => {
    if (curr.weight >= condition.start && curr.weight <= condition.end) {
        return {
        ...acc,
        count: acc.count + 1,
        sumPrice: acc.sumPrice + curr.price,
      }
    }
    return acc;
  }, {
    _id: condition._id,
    start: condition.start,
    end: condition.end,
    count: 0,
    sumPrice: 0,
  })
});

console.log(result);
[{_id : 1 , start : 1,end : 10 ,count : 2 , sumPrice :  34},
{_id : 2 , start : 11,end : 20 ,count : 1 , sumPrice :  10 },
{_id : 3 , start : 21,end : 30 ,count : 0 , sumPrice :  0  }]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...