Как использовать уменьшить и сопоставить новый объект для разрешения двойных значений в JS? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть ответ от бэкэнда, теперь формирующего новый объект. Также пытаюсь реализовать логику, если есть дублирующий объект сборки имени клиента, как у меня в ожидаемом результате? Я что-то упускаю в методе редукции, не принимая оператор спреда? Как правильно подходить к решению этой задачи?

main.js

const data = [
  {
      clientname: "SDK_AETNA",
      preferencename: "apiKey",
      preferencevalue: "a4ddaf8d-b74e-4158-87fb"
  }, 
  {
      clientname: "SDK_CLOVER",
      preferencename: "apiKey",
      preferencevalue: "9e8323b3-93b3-4bc9-a02d"
  }, 
  {
      clientname: "SDK_RMN",
      preferencename: "apiKey",
      preferencevalue: "60470ae8-ac70-429c-806"
  }, {
      clientname: "SDK_RMN",
      preferencename: "plapiKey",
      preferencevalue: "7c4f6820-e799-410c-876"
  }
];

function mapData(data)
{
  var tempArray= [];
  var myOrderedArray = data.reduce(function (accumulator, currentValue) 
  {
    var newObj = {};
    newObj.clientName = accumulator.clientname;
    newObject.apiKey = accumulator.preferencevalue;
    tempArray.push(newObj);
    
    if (accumulator.clientname === currentValue.clientname) 
    {
      if (newObj.clientName === currentValue.clientname)
      {
        ...newObj,
          plapikey: currentValue.preferencevalue
      }
    }
    
    return tempArray
  }, []);


}

mapData(data);
const data = [{
        clientname: "SDK_AETNA",
        preferencename: "apiKey",
        preferencevalue: "a4ddaf8d-b74e-4158-87fb"
    }, {
        clientname: "SDK_CLOVER",
        preferencename: "apiKey",
        preferencevalue: "9e8323b3-93b3-4bc9-a02d"
    }, {
        clientname: "SDK_RMN",
        preferencename: "apiKey",
        preferencevalue: "60470ae8-ac70-429c-806"
    }, {
        clientname: "SDK_RMN",
        preferencename: "plapiKey",
        preferencevalue: "7c4f6820-e799-410c-876"
    }];

    function mapData(data){
      var tempArray= [];
     var myOrderedArray = data.reduce(function (accumulator, currentValue) {
     var newObj = {};
     newObj.clientName = accumulator.clientname;
     newObject.apiKey = accumulator.preferencevalue;
     tempArray.push(newObj);
      if (accumulator.clientname === currentValue.clientname) {
          if (newObj.clientName === currentValue.clientname){
              ...newObj,
                plapikey: currentValue.preferencevalue
          }

       }
      return tempArray
    }, [])


    }

    mapData(data);

ожидаемый результат

 [{
    clientname: "SDK_AETNA",
    apiKey: "a4ddaf8d-b74e-4158-87fb"
}, {
    clientname: "SDK_CLOVER",
    apiKey: "9e8323b3-93b3-4bc9-a02d"
}, {
    clientname: "SDK_RMN",
    apiKey: "60470ae8-ac70-429c-806",
    plapikey: "7c4f6820-e799-410c-876"
}];

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

Когда вы reduce, используете объект (или Map), который отображается из clientname на нужный объект, чтобы вы могли соответствующим образом обновить его, когда найдете дубликат. Затем вы можете получить ваш окончательный массив с помощью Object.values:

const data = [{
  clientname: "SDK_AETNA",
  preferencename: "apiKey",
  preferencevalue: "a4ddaf8d-b74e-4158-87fb"
}, {
  clientname: "SDK_CLOVER",
  preferencename: "apiKey",
  preferencevalue: "9e8323b3-93b3-4bc9-a02d"
}, {
  clientname: "SDK_RMN",
  preferencename: "apiKey",
  preferencevalue: "60470ae8-ac70-429c-806"
}, {
  clientname: "SDK_RMN",
  preferencename: "plapiKey",
  preferencevalue: "7c4f6820-e799-410c-876"
}];

const result = Object.values(data.reduce((acc, {clientname, preferencename, preferencevalue}) => {
  acc[clientname] = acc[clientname] || {clientname};
  acc[clientname][preferencename] = preferencevalue;
  return acc;
}, {}));

console.log(result);
0 голосов
/ 11 октября 2019

Когда вы инициализируете уменьшение, вы передаете ему функцию обратного вызова в формате

function callback(accumilator, value, index, array)

вторым параметром является начальное значение аккумулятора. В вашем случае это [].

Затем он перебирает метод и применяет логику. В конце функции аккумулятор = возвращаемое значение вашего обратного вызова.

, например:

var myArray = [2, 4, 6, 8];
var myObject = {};

function myCallback(accumalator, value, index, arr)
{
  accumalator[value] = value * 2;
  return accumalator;
}

myArray.reduce(myCallback, myObject);

console.log(myObject);

// Now wityh duplicate filtering

var filteredArr = [];
function FilterDups(accumalator, value, index, arr)
{
  if (!accumalator[value]) 
  {
    accumalator[value] = true;
    filteredArr.push(value);
  }
  
  return accumalator;
}

var duplicateData = [ 2, 2, 3, 4, 5, 6, 6, 6 ]
duplicateData.reduce(FilterDups, {});
console.log(filteredArr)

Вы рассматриваете накопитель, как если бы это было значение в вашем массиве, когда это пустой массив для начала. Во-вторых, у тебя сравнение отключено

0 голосов
/ 11 октября 2019

Просто чистый reduce из исходных данных. Никаких дополнительных объектов не требуется.

function mapData(data) {
  return data.reduce((acc, curr) => {
    let newAcc = [...acc];
    let targetIdx = newAcc.findIndex(v => v.clientname === curr.clientname);
    if (targetIdx === -1) {
      newAcc = [...newAcc, { clientname: curr.clientname }];
      targetIdx = newAcc.length - 1;
    }
    return [
      ...newAcc.slice(0, targetIdx),
      { ...newAcc[targetIdx], [curr.preferencename]: curr.preferencevalue },
      ...newAcc.slice(targetIdx + 1),
    ];
  }, []);
}

const data = [
  {
    clientname: 'SDK_AETNA',
    preferencename: 'apiKey',
    preferencevalue: 'a4ddaf8d-b74e-4158-87fb',
  },
  {
    clientname: 'SDK_CLOVER',
    preferencename: 'apiKey',
    preferencevalue: '9e8323b3-93b3-4bc9-a02d',
  },
  {
    clientname: 'SDK_RMN',
    preferencename: 'apiKey',
    preferencevalue: '60470ae8-ac70-429c-806',
  },
  {
    clientname: 'SDK_RMN',
    preferencename: 'plapiKey',
    preferencevalue: '7c4f6820-e799-410c-876',
  },
];

console.log(mapData(data));
...