根據相同的值重新組織物件:逐步指南
P粉021553460
P粉021553460 2024-04-01 11:40:44
0
2
462

我有 3 個物件

[
{name: 3, q: 10, b: 1},
{name: 5, q: 6, b: 2},
{name: 5, q: 7, b: 1}
]

我需要按名稱對它們進行分組:

[
{name: 3: items: [{q:10, b: 1}]},
{name: 5: items: [{q:6, b: 2}, {q:7, b: 1}]},
]

也許lodash有什麼微妙的解決方案?

P粉021553460
P粉021553460

全部回覆(2)
P粉928591383

您可以使用Object.values 與 Array.prototype.reduce 結合()Array.prototype .push()

#程式碼:

const data = [
  { name: 3, q: 10, b: 1 },
  { name: 5, q: 6, b: 2 },
  { name: 5, q: 7, b: 1 },
]

const groupedData = Object.values(
  data.reduce((acc, obj) => {
    const { name, ...rest } = obj
    acc[name] = acc[name] || { name, items: [] }
    acc[name].items.push(rest)
    return acc
  }, {})
)

console.log(groupedData)
P粉884548619

你不需要lodash,你可以只使用JavaScript

const inputArray = [
  {name: 3, q: 10, b: 1},
  {name: 5, q: 6, b: 2},
  {name: 5, q: 7, b: 1}
];

使用forEach#

function groupItemsByName(array) {
  // create a groups to store your new items
  const groups = {};
  
  //loop through your array
  array.forEach(obj => {
    // destructure each object into name and the rest 
    const { name, ...rest } = obj;
    // if the named group doesnt exist create that name with an empty array
    if (!groups[name]) {
      groups[name] = { name, items: [] };
    }
    // add the items to the named group based on the name
    groups[name].items.push(rest);
  });

  return Object.values(groups);
}

const transformedArray = groupItemsByName(inputArray);

使用減少Object.values()

function groupItemsByName(array) {
  //Object.values returns an objects values as an array  
  return Object.values(
    array.reduce((groups, obj) => {
      // destructure as in the forEach method
      const { name, ...rest } = obj;
      // create the groups like in the previous method
      groups[name] = groups[name] || { name, items: [] };
      // push the items to the group based on the name
      groups[name].items.push(rest);
      return groups;
    }, {})
  );
}


const transformedArray = groupItemsByName(inputArray);

使用地圖和減少

#
const transformedArray = Array.from(
  inputArray.reduce((map, obj) => {
    const { name, ...rest } = obj;
    const existing = map.get(name) || { name, items: [] };
    existing.items.push(rest);
    return map.set(name, existing);
  }, new Map()).values()
);

輸出

console.log(transformedArray);
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板