如何在JavaScript / jQuery中向数组添加键值对

3
我有以下两个数组:

var dataSource = [
{location: "France", January: 79, February: 81, March: 23},  
{location: "Germany", January: 98, February: 83},
{location: "Japan", January: 96, March: 11} ];

var Months = ["January","February","March"];

我希望遍历dataSource中的每个对象,并检查每个对象中的Months值是否存在于dataSource中。如果该值不存在于dataSource中,则将该值添加到dataSource中,值为100。
例如:在德国地区,“三月”月份不存在,所以我需要推送键和值March : 100 最终,dataSource应如下所示。
var dataSource = [
{location: "France", January: 79, February: 81, March: 23},  
{location: "Germany", January: 98, February: 83, March: 100},
{location: "Japan", January: 96, February: 100, March: 11} ];

我尝试了之前帖子中的很多解决方案,但我没有得到我想要的确切结果。这里是我的一些想法。

var dataSource = [
{location: "France", January: 79, February: 81, March: 23},  
{location: "Germany", January: 98, February: 83},
{location: "Japan", January: 96, March: 11} ];

var Months = ["January","February","March"];

dataSource.forEach(function(element) {
Months.forEach(function(item) {
  if (!(item in element)) {
//Object.assign(dataSource, {item: 100}); 
//dataSource = {...dataSource, ...{item: 100}}
dataSource.push({item: 100});
  }
});
});

console.log(dataSource);

感谢您的建议。
5个回答

6
你可以使用 Array.map() 来遍历 dataSource 数组。使用内部的 Array.reduce() 遍历月份,并将缺失的月份添加到当前对象中:

const dataSource = [{"location":"France","January":79,"February":81,"March":23},{"location":"Germany","January":98,"February":83},{"location":"Japan","January":96,"March":11}];
const Months = ["January","February","March"];

const result = dataSource.map(o =>
  Months.reduce((obj, m) => m in obj ? obj : { ...obj, [m]: 100 }, o)
);

console.log(result);


2
你可以循环遍历源和月份,在源上设置月份为它们已经拥有的值,或默认为100。最初的回答。

var dataSource = [{
    location: "France",
    January: 79,
    February: 81,
    March: 23
  },
  {
    location: "Germany",
    January: 98,
    February: 83
  },
  {
    location: "Japan",
    January: 96,
    March: 11
  }
];

var Months = ["January", "February", "March"];

dataSource.forEach(function(element){
  Months.forEach(function(month){
    if (element[month] === undefined) element[month] = 100;
  });
});

console.log(dataSource);


这将把显式的 0 改为 100 - Barmar
@Barmar,好眼力,已修复。 - Taplar

1

或者,您可以创建一个包含结果月份及其值的哈希表,直接使用它,通过在其顶部分配数组的每个对象,您可以处理 N 个输入(数组)相同的哈希表。

结果哈希表示例:{January: 100, February: 100, March: 100}

然后您可以重复进行此操作 N 次:

dataSource1.map(d => ({...hash, ...d}));
dataSource2.map(d => ({...hash, ...d}));
dataSource3.map(d => ({...hash, ...d}));

这里是例子:

let dataSource = [{"location":"France","January":79,"February":81,"March":23},{"location":"Germany","January":98,"February":83},{"location":"Japan","January":96,"March":11}],
    Months = ["January","February","March"],
    hash = Months.reduce((r, e) => ({...r, [e]: 100}), {}),
    res = dataSource.map(d => ({...hash, ...d}));
    
console.log('This is your hash: ', hash); //This is the hash generated one time
console.log('This is your result: ', res); //this is the result against that input


0
也许这个简短的解决方案可以遍历每个月份,并检查数据源中是否存在该月份的记录。如果不存在,则添加默认值,例如在您的情况下为100。
for(i=0;i<dataSource.length;i++){
        for(j=0;j<Months.length;j++){
            if(Months[j] in dataSource[i]){
            }
            else{
                dataSource[i][Months[j]] = 100;
            }   
        }
    }

0
也许这可以帮到你。只需在开发者工具或其他地方运行test(),并查看控制台输出

注意uniqueKeys对象,因为它是主要逻辑的中心和hasOwnProperty的内容。

function test() {

    var uniqueKeys = {location: ''};                        //default to have location set
    var Months = ['January', 'February', 'March'];

    for (var i = 0; i < Months.length; i++) {
        uniqueKeys[Months[i]] = '';                     //just populate the object from the array to use soon
    }


    for (var i = 0; i < dataSource.length; i++) {




        var validObject = true;
        Object.keys(uniqueKeys).forEach((e,j) => {

            if (dataSource[i].hasOwnProperty(e) === false) {
                validObject = false;
            }

        });

        if (validObject === false) {

            console.log('add to', dataSource[i], 'to balance it out');

        }
    }
}

希望能对您有所帮助 ~干杯


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