微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在普通JS上数组? 完整代码

如何解决如何在普通JS上数组? 完整代码

我不确定是否应该将其称为归一化,但是我没有想到更好的名称,因此任务是: 我有一个对象数组(我们叫它 mainData ,其中包含obj1obj2),一个道具是对象数组someDatasomeData中的对象及其数量各不相同。我想使用 mainData ,但是每个包含的对象在someData内部应具有相同的对象,如下所示: 我有

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

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

我想要:

let obj1 = {
    someData: [
        {
            name: 'Name 1',value: null,}        
    ]
}

let obj2 = {
    someData: [
        {
            name: 'Name 1',}
    ]
}

解决方法

尝试一下。遍历每个数组,然后检查对象是否在另一个数组中。如果不是,则将其推送为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",{
      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);

,

您可以存储唯一名称的数组。并遍历每个数据,如果名称相同,则保持不变,否则添加一个值为null的新数据

const getNames = arr => arr.map(el => el.name)
const buildNewDataFromUniqueNames = (arr,uniqueNames) =>
  uniqueNames.map(name => {
    const el = arr.find(el => el.name === name)
    return el || { name,value: null }
  })

const uniqueNames = Array.from(
  new Set([...getNames(data1),...getNames(data2)])
)

console.log({ someData: buildNewDataFromUniqueNames(data1,uniqueNames) })
console.log({ someData: buildNewDataFromUniqueNames(data2,uniqueNames) })

完整代码

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

let { someData: data2 } = {
  someData: [
    {
      name: 'Name 1',{
      name: 'Name 4',{
      name: 'Name 5',value: 5555
    }
  ]
}

const getNames = arr => arr.map(el => el.name)
const buildNewDataFromUniqueNames = (arr,uniqueNames) })

,

这是一个通用函数,它不依赖于硬编码的属性名称(例如“ name”或“ value”),但是将“ key”属性的名称作为参数,并将任何其他属性设置为{{ 1}}。

该函数使用null来确保在另一个数组中有效查找项目,避免了 O(n²)的时间复杂度(使用Map和相似的方法)。

结果数组也将根据key属性的大小进行排序:

find

,

您可以获取所有严重的名称,并将该数组与其他数组的数据映射,或者使用具有real_start_at值的新对象。

null
const
    map = (source,i = 0) => name => source[i]?.name === name
        ? source[i++]
        : { name,value: null },array1 = [{ name: 'Name 1',value: 1111 },{ name: 'Name 2',value: 2222 },{ name: 'Name 3',value: 3333 }],array2 = [{ name: 'Name 1',{ name: 'Name 4',value: 4444 },{ name: 'Name 5',value: 5555 }],names = [...new Set([...array1,...array2].map(({ name }) => name))].sort(),result1 = names.map(map(array1)),result2 = names.map(map(array2));

console.log(result1);
console.log(result2);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。