JavaScript 填充数组中的缺失对象和值

3

我有一个数组,每个索引包含不同的对象集合,我想创建一个统一的数据,其中在每个索引中缺少的对象将带有值:0。

var d = [
          [
            {axis:"Email",value:59,id:1},
            {axis:"Social Networks",value:56,id:2},

          ],
          [

            {axis:"Sending Money",value:18,id:6},
            {axis:"Other",value:15,id:7},

          ]
        ];

如何使用上面的数组得到下面这样的数组:
var d = [
          [
            {axis:"Email",value:59,id:1},
            {axis:"Social Networks",value:56,id:2},
            {axis:"Sending Money",value:0,id:6},
            {axis:"Other",value:0,id:7},

          ],
          [
            {axis:"Email",value:0,id:1},
            {axis:"Social Networks",value:0,id:2},
            {axis:"Sending Money",value:18,id:6},
            {axis:"Other",value:15,id:7},

          ]
        ];

3
关于此,你有什么问题吗? - Felix Kling
通过迭代它。 - Adam Jenkins
这个能做到吗?如果可以,怎么做?有没有函数可以操作数组? - kuntal
2
@matrixwebtech 原生JS方法就是你所需要的。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array 此外,Stack Overflow上的人们通常不喜欢回答那些提问者没有表现出自己尝试解决问题的兴趣的问题。 - Adam Jenkins
数组中的顺序是否重要?为什么Email排在第一位而不是发送资金?名字列表是固定的还是您想从您拥有的数据中计算它?如果您可以提供列表,例如var headers = ['电子邮件','社交网络','发送资金','其他'],那么即使按照所需的顺序生成输出也很容易。如果您不能,则仍然可以生成缺失的条目,但无法保证顺序。 - Felix Kling
3个回答

1

有两个函数:

getAllEntries 找到所有对象并将它们存储到变量 accEntries 中。然后使用 accEntries 在一个子数组 d 中搜索所有出现的情况。整个过程在 checkArray 中完成。

checkArray 用于获取在 d 中找到和未找到的所有条目。找到和未找到的两个数组都被用来构建一个新的子数组,其中包含具有特定值的已找到条目和值为0的未找到条目。

希望这可以帮助:

var d = [
  [
  {
    axis: 'Email',
    value: 59,
    id: 1
  },
  {
    axis: 'Social Networks',
    value: 56,
    id: 2
  },
  ],
  [
    {
      axis: 'Sending Money',
      value: 18,
      id: 6
    },
    {
      axis: 'Other',
      value: 15,
      id: 7
    },
  ]
];
  

function getAllEntries(array) {
  var uniqueEntries = [];
  array.forEach(function (subarray) {
    subarray.forEach(function (obj) {
      if (uniqueEntries.indexOf(obj) === - 1) uniqueEntries.push(obj);
    });
  });
  return uniqueEntries;
}


function checkArray(array, acceptedEntries) {
  var result = [];
  array.forEach(function (subArray) {
    var subResult = [];
    var foundEntries = [];
    subArray.forEach(function (obj) {
      if (foundEntries.indexOf(obj.axis) === - 1) foundEntries.push(obj.axis);
    });
    var notFound = acceptedEntries.filter(function (accepted) {
      return foundEntries.indexOf(accepted.axis) === - 1;
    });
    foundEntries.forEach(function (found) {
      subArray.forEach(function (obj) {
        if (obj.axis === found) subResult.push(obj);
      });
    });
    notFound.forEach(function (notfound, index) {
      subResult.push({
        axis: notfound.axis,
        value: 0,
        id: notfound.id
      });
    });
    result.push(subResult);
  });
  return result;
}


var accEntries = getAllEntries(d);
var result = checkArray(d, accEntries);
console.log(result);


至少在你按下“运行代码片段”时,可以查看所需的数组。描述仍在更新中。 - Blauharley

0

您可以循环遍历数组以查找所有唯一对象,然后再次循环遍历以将与唯一键对象数组进行比较不在其中的值推入。

您可以使用ES6语法查找具有属性的对象是否存在,例如uniKeys.findIndex(obj => obj.axis === val.axis);,并使用展开语法推送零值,例如d[index].push({...val, value: 0});

以下是实现的代码片段

var d = [
          [
            {axis:"Email",value:59,id:1},
            {axis:"Social Networks",value:56,id:2},

          ],
          [

            {axis:"Sending Money",value:18,id:6},
            {axis:"Other",value:15,id:7},
            {axis:"Social Networks",value:89,id:2},
          ]
        ];
            
var uniKeys = [];
  $.each(d, function(index, item) {
  
              $.each(item, function(idx, val){
                    const pos = uniKeys.findIndex(obj => obj.axis === val.axis);
               
               if(pos == - 1) {
                    uniKeys.push(val);
                }
                
               })
            })
  
  $.each(d, function(index, item) {
             var temp = [];
              $.each(uniKeys, function(idx, val){
                    const pos = item.findIndex(obj => obj.axis === val.axis);
               
               if(pos == - 1) {
                    
                    d[index].push({...val, value: 0});
                    
                }
                
               })
              
            })
  console.log(d);
  
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


请不要误解我,但第二个子数组中的社交网络是正确的吗?还是我眼花了? - Blauharley
@Blauharley,根据我的实现,我认为它是正确的。为了演示,我在原始数组中添加了一个额外的对象,以便在两个数组中都存在该对象时给出一个案例,请先看一下我的输入。 - Shubham Khatri

-1

怎么样写一个简短的shallowCopy函数(因为IE不支持Object.assign),代码行数少于10行?

var d = [
      [
        {axis:"Email",value:59,id:1},
        {axis:"Social Networks",value:56,id:2}
      ],
      [
        {axis:"Sending Money",value:18,id:6},
        {axis:"Other",value:15,id:7}
      ]
    ];

var newD_0 = [shallowCopy(d[0][0]), shallowCopy(d[0][1]), shallowCopy(d[1][0]), shallowCopy(d[1][1])];
var newD_1 = [shallowCopy(d[0][0]), shallowCopy(d[0][1]), shallowCopy(d[1][0]), shallowCopy(d[1][1])];

newD_0[2].id = 0; 
newD_0[3].id = 0;
newD_1[0].id = 0;
newD_1[1].id = 0;

d = [newD_0, newD_1];

function shallowCopy(obj) {
    var copy = {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            copy[key] = obj[key];   
        }
    }
    return copy;
}

console.log(JSON.stringify(d));

结果:

[  
   [  
      {  
         "axis":"Email",
         "value":59,
         "id":1
      },
      {  
         "axis":"Social Networks",
         "value":56,
         "id":2
      },
      {  
         "axis":"Sending Money",
         "value":18,
         "id":0
      },
      {  
         "axis":"Other",
         "value":15,
         "id":0
      }
   ],
   [  
      {  
         "axis":"Email",
         "value":59,
         "id":0
      },
      {  
         "axis":"Social Networks",
         "value":56,
         "id":0
      },
      {  
         "axis":"Sending Money",
         "value":18,
         "id":6
      },
      {  
         "axis":"Other",
         "value":15,
         "id":7
      }
   ]
]   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接