Lodash — Сопоставление массива сущности / ключа / значения с объектом со свойствами

#arrays #lodash

#массивы #Lodash

Вопрос:

У меня есть следующий массив:

 [
  {
    "name": "ABC",
    "type": "iPhone",
    "sessions": "3.0"
  },
  {
    "name": "ABC",
    "type": "Android",
    "sessions": "25.0"
  },
  {
    "name": "ABC",
    "type": "Windows",
    "sessions": "3.0"
  },
  {
    "name": "XYZ",
    "type": "iPhone",
    "sessions": "1.0"
  },
  {
    "name": "XYZ",
    "type": "Android",
    "sessions": "11.0"
  },
  {
    "name": "XYZ",
    "type": "Windows",
    "sessions": "15.0"
  },
  {
    "name": "XYZ",
    "type": "Outlook",
    "sessions": "10.0"
  },
  {
    "name": "DEF",
    "type": "Windows",
    "sessions": "10.0"
  },
  {
    "name": "GHI",
    "type": "iPhone",
    "sessions": "10.0"
  }
]
  

Я хотел бы преобразовать это в массив объектов следующим образом, используя Lodash:

 [
  {
    "name": "ABC",
    "iPhone": "3.0",
    "Android": "25.0",
    "Windows": "3.0",
    "Outlook": ""
  },
  {
    "name": "XYZ",
    "iPhone": "1.0",
    "Android": "11.0",
    "Windows": "15.0",
    "Outlook": "10.0"
  },
  {
    "name": "DEF",
    "iPhone": "",
    "Android": "",
    "Windows": "10.0",
    "Outlook": ""
  },
  {
    "name": "GHI",
    "iPhone": "10.0",
    "Android": "",
    "Windows": "",
    "Outlook": ""
  }
]
  

В основном свойство «name» должно использоваться в качестве ключа для объединения свойств в объект. Есть какой-нибудь краткий способ сделать это с Lodash?

Ответ №1:

Вы можете использовать Lodash _.transform() :

 var arr = [{"name":"ABC","type":"iPhone","sessions":"3.0"},{"name":"ABC","type":"Android","sessions":"25.0"},{"name":"ABC","type":"Windows","sessions":"3.0"},{"name":"XYZ","type":"iPhone","sessions":"1.0"},{"name":"XYZ","type":"Android","sessions":"11.0"},{"name":"XYZ","type":"Windows","sessions":"15.0"},{"name":"XYZ","type":"Outlook","sessions":"10.0"},{"name":"DEF","type":"Windows","sessions":"10.0"},{"name":"GHI","type":"iPhone","sessions":"10.0"}];

var result = _.transform(arr, function(products, item) {
    var product = products[item.name] = products[item.name] || {
      name: item.name,
      iPhone: "",
      Android: "",
      Windows: "",
      Outlook: ""
    };

    product[item.type] = item.sessions;

    return products;
  }, {});

console.log(result);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>  

Ответ №2:

Другим решением может быть:

 var f = [{
  "name": "ABC",
  "type": "iPhone",
  "sessions": "3.0"
}, {
  "name": "ABC",
  "type": "Android",
  "sessions": "25.0"
}, {
  "name": "ABC",
  "type": "Windows",
  "sessions": "3.0"
}, {
  "name": "XYZ",
  "type": "iPhone",
  "sessions": "1.0"
}, {
  "name": "XYZ",
  "type": "Android",
  "sessions": "11.0"
}, {
  "name": "XYZ",
  "type": "Windows",
  "sessions": "15.0"
}, {
  "name": "XYZ",
  "type": "Outlook",
  "sessions": "10.0"
}, {
  "name": "DEF",
  "type": "Windows",
  "sessions": "10.0"
}, {
  "name": "GHI",
  "type": "iPhone",
  "sessions": "10.0"
}];

var def = {
  "name": "",
  "iPhone": "",
  "Android": "",
  "Windows": "",
  "Outlook": ""
};

function updateMemo(memo, obj) {
  memo[obj.name] = memo[obj.name] || _.extend({}, def, {name: obj.name});
  memo[obj.name][obj.type] = obj.sessions;
  return memo;
}

console.log(_.values(_.reduce(f, updateMemo, {})));  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>  

Он состоит из выполнения сокращения массива, хранящего значения в промежуточном объекте. Сохраненные значения соответствуют структуре по умолчанию. После создания массива возвращаются только значения, чтобы получить ожидаемый результат.

Надеюсь, это поможет.

Ответ №3:

Это возможно с помощью метода Lodash mapKeys , но ваше значение должно быть объектом, а не примитивным значением.

 let orig = {" a ":{rate: 1}, " b ":{rate: 2}};

let result = _.mapKeys(orig, (value, key)=> {
  
  value.rate = value.rate   1
  return key.trim()
})

console.log(result)  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>