Как разделить `CurrencyID` и `currencyCode` от остальных элементов в массиве `control`

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Я хочу currencyId разделить и currencyCode от остальных элементов в control массиве. Прямо сейчас он выдает вывод, подобный :

 [{
  channels: {ANDROID: 0,EMAIL: 0,INBOX: 0,IOS: 0,SMS: 0,TELEGRAM: 0,currencyCode: "CFA",currencyId: 11},
  currency: {currencyCode: "CFA",currencyId: 11} 
}]
  

Но я хочу, чтобы вывод был таким :

 [{
  channels: {ANDROID: 0,EMAIL: 0,INBOX: 0,IOS: 0,SMS: 0,TELEGRAM: 0},
  currency: {currencyCode: "CFA",currencyId: 11} 
}]
  

Пока это мой код:

 let chargesData = [
          {
            "SMS": 0,
            "IOS": 0,
            "ANDROID": 0,
            "EMAIL": 0,
            "currencyId": 11,
            "currencyCode": "CFA",
            "TELEGRAM": 0,
            "INBOX": 0
          },
          {
            "SMS": 10,
            "IOS": 10,
            "ANDROID": 10,
            "EMAIL": 10,
            "currencyId": 12,
            "currencyCode": "IND",
            "TELEGRAM": 10,
            "INBOX": 10
          }
        ]


    let control = [];
    let currency;
    for(let charges of chargesData) {
      let chargesChannels = Object.keys(charges)
      
      let currencyCode = chargesChannels.indexOf("currencyCode");
      let currencyId = chargesChannels.indexOf("currencyId");
      chargesChannels.splice(currencyCode, 1);
      chargesChannels.splice(currencyId, 1);
      
      currency = { currencyCode: charges.currencyCode, currencyId: charges.currencyId };
      control.push({
        channels: charges,
        currency: currency
      })
    }
    console.log(control);
  
  

Как это сделать?

Ответ №1:

Вы можете сделать это с помощью .map и destructuring :

 let chargesData = [
  {
    "SMS": 0,
    "IOS": 0,
    "ANDROID": 0,
    "EMAIL": 0,
    "currencyId": 11,
    "currencyCode": "CFA",
    "TELEGRAM": 0,
    "INBOX": 0
  },
  {
    "SMS": 10,
    "IOS": 10,
    "ANDROID": 10,
    "EMAIL": 10,
    "currencyId": 12,
    "currencyCode": "IND",
    "TELEGRAM": 10,
    "INBOX": 10
  }
]

const arr = chargesData.map(e => {
  const {currencyCode, currencyId, ...channels} = e;
  return {
    channels: channels,
    currency: {currencyCode, currencyId}
  }
});

console.log(arr);  

Комментарии:

1. Спасибо за ответ. Но что означает const {currencyCode, currencyId, ...channels} = e; эта строка? что такое e

2. @NehalJaisalmeria добро пожаловать. e обозначает объект на каждой итерации, а назначение деструктурирования разбивает его на currencyCode , currencyId , и channels объект, содержащий остальные атрибуты. Я обновил ответ ссылками на документы для получения более подробной информации.

Ответ №2:

вы можете выполнить итерацию по массиву, а затем по свойствам объекта с помощью in operator, а затем выделить объект по мере необходимости.

 let chargesData = [
    {
    "SMS": 0,
    "IOS": 0,
    "ANDROID": 0,
    "EMAIL": 0,
    "currencyId": 11,
    "currencyCode": "CFA",
    "TELEGRAM": 0,
    "INBOX": 0
    },
    {
    "SMS": 10,
    "IOS": 10,
    "ANDROID": 10,
    "EMAIL": 10,
    "currencyId": 12,
    "currencyCode": "IND",
    "TELEGRAM": 10,
    "INBOX": 10
    }
];

const controls = [];
chargesData.forEach(charges=>{
    const control={
        channels:{},
        currency:{}
    }
    for (const key in charges) {
        if(["currencyCode","currencyId"].includes(key)){
            control.currency[key]=charges[key];
        }else{
            control.channels[key]=charges[key];
        }
    }
    controls.push(control);
});
console.log(controls);