首页 > 解决方案 > 如何在纯JS上排列?

问题描述

我不确定它应该被称为规范化,但我没有想到更好的名字,所以任务:我有一个对象数组(我们称之为包含and的mainData),一个道具是对象数组。里面的物体和数量各不相同。我想获取mainData但每个包含对象都应该有相同的对象,如下所示:我有:obj1obj2someDatasomeDatasomeData

let obj1 = {
    someData: [
        {
            name: 'Name 1',
            value: 1111,
        },
        {
            name: 'Name 2',
            value: 2222,
        },
        {
            name: 'Name 3',
            value: 3333,
        }
    ]
}

let obj2 = {
    someData: [
        {
            name: 'Name 1',
            value: 1111,
        },
        {
            name: 'Name 2',
            value: 2222,
        },
        {
            name: 'Name 4',
            value: 4444,
        },
        {
            name: 'Name 5',
            value: 5555,
        }
    ]
}

我想:

let obj1 = {
    someData: [
        {
            name: 'Name 1',
            value: 1111,
        },
        {
            name: 'Name 2',
            value: 2222,
        },
        {
            name: 'Name 3',
            value: 3333,
        },
        {
            name: 'Name 4',
            value: null,
        },
        {
            name: 'Name 5',
            value: null,
        }        
    ]
}

let obj2 = {
    someData: [
        {
            name: 'Name 1',
            value: 1111,
        },
        {
            name: 'Name 2',
            value: 2222,
        },
        {
            name: 'Name 3',
            value: null,
        },
        {
            name: 'Name 4',
            value: 4444,
        },
        {
            name: 'Name 5',
            value: 5555,
        }
    ]
}

标签: javascriptarraysjavascript-objects

解决方案


试试这个。循环遍历每个数组并检查对象是否存在于另一个数组中。如果不以 null 值推送它。请在下面找到一个示例。

let obj1 = {
  someData: [
    {
      name: "Name 1",
      value: 1111
    },
    {
      name: "Name 2",
      value: 2222
    },
    {
      name: "Name 3",
      value: 3333
    }
  ]
};

let obj2 = {
  someData: [
    {
      name: "Name 1",
      value: 1111
    },
    {
      name: "Name 2",
      value: 2222
    },
    {
      name: "Name 4",
      value: 4444
    },
    {
      name: "Name 5",
      value: 5555
    }
  ]
};

obj1.someData.forEach(obj => {
  const itemInSecondArray = obj2.someData.find(
    item => item.name === obj.name
  );
  if (!itemInSecondArray) {
    obj2.someData.push({
      name: obj.name,
      value: null
    });
  }
});

obj2.someData.forEach(obj => {
  const itemInFirstArray = obj1.someData.find(
    item => item.name === obj.name
  );
  if (!itemInFirstArray) {
    obj1.someData.push({
      name: obj.name,
      value: null
    });
  }
});

// Sort
obj1.someData.sort((a, b) =>  (a.name < b.name)? -1: 1);
obj2.someData.sort((a, b) =>  (a.name < b.name)? -1: 1);

console.log(obj1);
console.log(obj2);


推荐阅读