Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使阵列对象都具有相同的键_Javascript_Jquery_Arrays_Object - Fatal编程技术网

Javascript 使阵列对象都具有相同的键

Javascript 使阵列对象都具有相同的键,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,我有一个对象数组 var arr = [ {"shares":50,"comments":10}, {"likes":40,"shares":30}, {"comments":10} ]; 我想把它转换成 var arr = [ {"shares":50,"comments":10,"likes":0}, {"likes":40,"shares":30,"comments":0}, {"comments":10,"likes":0,"shar

我有一个对象数组

var arr = 
[
    {"shares":50,"comments":10},
    {"likes":40,"shares":30},
    {"comments":10}
];
我想把它转换成

var arr = 
[
    {"shares":50,"comments":10,"likes":0},
    {"likes":40,"shares":30,"comments":0},
    {"comments":10,"likes":0,"shares":0}
]
属性不是固定的数字,名称也会有所不同,请参见另一个示例

var arr2 = [{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"f":6}]

我可以迭代数组的所有元素和每个元素的键,但我不知道,这是最好的方法吗

JavaScript或jQuery中是否有内置函数

看起来像是你想要的

var set = {}; // it will be cleaner with ES6 Set
$.each(arr, function(_,e){
     for (var k in e) set[k] = 1;
});
$.each(set, function(k){
    $.each(arr, function(_,e){
        if (e[k]===undefined) e[k] = 0;
    });
});

看起来像是你想要的

var set = {}; // it will be cleaner with ES6 Set
$.each(arr, function(_,e){
     for (var k in e) set[k] = 1;
});
$.each(set, function(k){
    $.each(arr, function(_,e){
        if (e[k]===undefined) e[k] = 0;
    });
});

只要添加带值的键,如果它不存在:

$(function() {
    var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];
    $.each(arr, function(idx, obj) {
        if (typeof obj.shares === 'undefined') {
            obj.shares = 0;
        }
        if (typeof obj.comments === 'undefined') {
            obj.comments = 0;
        }
        if (typeof obj.likes === 'undefined') {
            obj.likes = 0;
        }
        arr[idx] = obj;
    });
    console.log(arr);


});

只需添加带值的键(如果不存在):

$(function() {
    var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];
    $.each(arr, function(idx, obj) {
        if (typeof obj.shares === 'undefined') {
            obj.shares = 0;
        }
        if (typeof obj.comments === 'undefined') {
            obj.comments = 0;
        }
        if (typeof obj.likes === 'undefined') {
            obj.likes = 0;
        }
        arr[idx] = obj;
    });
    console.log(arr);


});
你可以用

编辑:更新的问题

现在需要构建
默认值
对象,据我所知,该对象具有数组中所有元素的所有唯一键

因此,考虑到

var arr2 = [{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"f":6}]
你需要提取“a”,“b”,“c”,“d”。。。etc并创建
默认值

var defaults = {};
// collect all the keys and set them with value = 0 in defaults
arr2.forEach( function( item ){ 
    Object.keys( item ).forEach( function( key ){
        defaults[ key ] = 0;
    });
});

// same as the previous solution
arr2 = $.map( arr2, function( item ){
        return $.extend( {}, defaults, item ); 
    });
您可以使用

编辑:更新的问题

现在需要构建
默认值
对象,据我所知,该对象具有数组中所有元素的所有唯一键

因此,考虑到

var arr2 = [{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"f":6}]
你需要提取“a”,“b”,“c”,“d”。。。etc并创建
默认值

var defaults = {};
// collect all the keys and set them with value = 0 in defaults
arr2.forEach( function( item ){ 
    Object.keys( item ).forEach( function( key ){
        defaults[ key ] = 0;
    });
});

// same as the previous solution
arr2 = $.map( arr2, function( item ){
        return $.extend( {}, defaults, item ); 
    });
使用纯JavaScript时:

var defaults = { "shares": 0, "comments": 0, "likes": 0 };
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];

arr.slice().map(function(e) {
  for (var key in defaults) {
    e[key] = e[key] || defaults[key];
  }
  return e;
});
这将保持原始阵列的原样。如果要更改原始阵列,可以执行以下操作:

var defaults = { "shares": 0, "comments": 0, "likes": 0 };
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];

arr.forEach(function(e) {
  for (var key in defaults) {
    e[key] = e[key] || defaults[key];
  }
}); 
您可以使用以下代码段从数组中获取默认值:

var defaults = arr.reduce(function(m,v) {
 for (var key in v) {
  m[key] = 0;
 }
 return m;
}, {});
使用纯JavaScript:

var defaults = { "shares": 0, "comments": 0, "likes": 0 };
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];

arr.slice().map(function(e) {
  for (var key in defaults) {
    e[key] = e[key] || defaults[key];
  }
  return e;
});
这将保持原始阵列的原样。如果要更改原始阵列,可以执行以下操作:

var defaults = { "shares": 0, "comments": 0, "likes": 0 };
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}];

arr.forEach(function(e) {
  for (var key in defaults) {
    e[key] = e[key] || defaults[key];
  }
}); 
您可以使用以下代码段从数组中获取默认值:

var defaults = arr.reduce(function(m,v) {
 for (var key in v) {
  m[key] = 0;
 }
 return m;
}, {});

在@Dashy所说的基础上,如果您实际上不知道将出现哪些列,您可以将列列表作为字符串集。还假设您只想编辑现有阵列,而不是创建新阵列,并使用ES6

    // get all keys added to a list that cannot take duplicates
    const columnNames = new Set<string>();
    arr.forEach(element => {
      Object.keys(element)
        .forEach(x => columnNames.add(x));
    });

    // create default with nulls, can replace with 0 or anything here
    const defaultKeys = {};
    columnNames.forEach(x => {
      defaultKeys[x] = null;
    });

    // Add all missing keys into each object
    arr.forEach((element) => {
      for (const key in defaultKeys) {
        element[key] = element[key] || defaultKeys[key];
      }
    });
//将所有密钥添加到不能获取重复项的列表中
const columnNames=new Set();
arr.forEach(元素=>{
Object.keys(元素)
.forEach(x=>columnNames.add(x));
});
//使用空值创建默认值,可以在此处替换为0或任何内容
const defaultKeys={};
columnNames.forEach(x=>{
defaultKeys[x]=null;
});
//将所有缺少的关键点添加到每个对象中
arr.forEach((元素)=>{
for(默认密钥中的常量密钥){
元素[键]=元素[键]| |默认键[键];
}
});

根据@Dashy所说的,如果您不知道将出现哪些列,您可以将列列表作为字符串集。还假设您只想编辑现有阵列,而不是创建新阵列,并使用ES6

    // get all keys added to a list that cannot take duplicates
    const columnNames = new Set<string>();
    arr.forEach(element => {
      Object.keys(element)
        .forEach(x => columnNames.add(x));
    });

    // create default with nulls, can replace with 0 or anything here
    const defaultKeys = {};
    columnNames.forEach(x => {
      defaultKeys[x] = null;
    });

    // Add all missing keys into each object
    arr.forEach((element) => {
      for (const key in defaultKeys) {
        element[key] = element[key] || defaultKeys[key];
      }
    });
//将所有密钥添加到不能获取重复项的列表中
const columnNames=new Set();
arr.forEach(元素=>{
Object.keys(元素)
.forEach(x=>columnNames.add(x));
});
//使用空值创建默认值,可以在此处替换为0或任何内容
const defaultKeys={};
columnNames.forEach(x=>{
defaultKeys[x]=null;
});
//将所有缺少的关键点添加到每个对象中
arr.forEach((元素)=>{
for(默认密钥中的常量密钥){
元素[键]=元素[键]| |默认键[键];
}
});

如果不存在,他想添加共享、注释和类键。@dystroy,我认为这更像是添加缺少的键并将值设置为0。这是否只适用于
共享
注释
或任何类型的字段,以便所有对象都具有相同的字段?他想添加共享,注释和like键(如果不存在)。@dystroy,我认为这更像是添加缺少的键并将值设置为0。这是否仅适用于
共享
注释
like
或任何类型的字段,以便所有对象都具有相同的字段?属性不是固定的,名字和号码会不一样,那么背后的逻辑是什么呢?澄清你的问题please@GovindKamalaPrakashMalviya请参阅更新的非固定属性代码属性不固定,名称和编号将不同。那么这背后的逻辑是什么?澄清你的问题please@GovindKamalaPrakashMalviya请参阅更新的代码以了解“未修复”properties@PraveenPrasannan“属性不是固定的数字,名称也会有所不同,请参见另一个示例”@dystroy在我发布了原始问题的答案后,问题已被编辑。这也解决了我的问题。@PraveenPrasannan“属性不是固定的数字,名称也会有所不同。请看另一个例子”@dystroy在我发布了原始问题的答案后,问题已被编辑。这也解决了我的问题。