Javascript根据另一个对象的键和值写入新对象

时间:2017-03-22 20:39:30

标签: javascript jquery

我有一个大对象,并且对象中的每个元素都没有相同的键或键数。第一个元素包含所有键,第一个元素的是我想要实际用作每个元素的键,填充空格,其中元素没有此键

我可以将我的大脑包围在需要发生的事情中,但我无法弄清楚如何编码它。这是导入它的示例:

[
    {
        "A": "Name",
        "B": "Type",
        "C": "Company",
        "D": "Year",
        "E": "Alt1",
        "F": "Name1",
        "G": "Alt2",
        "H": "Name2",
        "I": "Notes"
    },
    {
        "A": "Skittles",
        "C": "Mars",
        "D": 0,
        "E": "Cadbury",
        "F": "Sour Patch Kids",
        "I": "CLEAN"
    },
    {
        "A": "Love",
        "B": "Chocolate",
        "C": "Dove",
        "D": 0,
        "E": "0",
        "F": "0",
    }
]

在此示例中,第二个元素缺少键" B"," G"和" H",而第三个元素缺少键&# 34; G"," H"和"我"。因此,使用FIRST元素的键A through I作为主模板,我想重写一个 new 对象,如下所示:

[
    {
        "Name": "Skittles",
        "Type": "",
        "Company": "Mars",
        "Year": 0,
        "Alt1": "Cadbury",
        "Name1": "Sour Patch Kids",
        "Alt2": "",
        "Name2": "",
        "Notes": "CLEAN"
    },
    {
        "Name": "Love",
        "Type" : "Chocolate",
        "Company": "Dove",
        "Year": 0,
        "Alt1": "",
        "Name1": "",
        "Alt2": "",
        "Name2": "",
        "Notes": ""
    }
]

我已经写了几个for循环,但我似乎无法理解这个的复杂性......这就是我已经得到的:

a = [];
b = [];
new_keys = [];

/* Capture the new keys */
for(var v in user_file[0]) {
  if(user_file[0].hasOwnProperty(v)) {
    new_keys.push(user_file[0][v]);
  }
}

/* user_file is the object I pasted above... */
for ( var i = 0 ; i<user_file.length; i++ ) {
    /* write the b object */

    /* then push that object into a */
    a.push(b);

    /* Empty out b */
    b = [];
}

我不知道如何编写这个b[]对象......

5 个答案:

答案 0 :(得分:2)

你真的很亲密。

在Javascript中,您实际上可以访问像数组这样的对象。 obj['key1']将返回与obj.key1相同的值。

现在您已经拥有了这些密钥的列表,并且您知道哪个字母A, B, C, etc.对应于哪个密钥(user_file[0][letter]),您实际上可以迭代这些密钥并使用临时对象来存储信息(tmp[user_file[0][letter]] = user_file[i][letter])。

但如果user_file[i][letter]不存在怎么办? 这是有关javascript的最酷功能之一:truthiness。当一个对象没有属性并且您尝试访问它时,它将返回一个假值(nullundefined,我无法记住我的顶部头)。

那么你如何应用真实性?好吧,你可以把它当作一个布尔(有点)对待它,并实际上对它使用||操作。这是一种称为合并的技术。

tmp[user_file[0][letter]] = user_file[i][letter] || "";

如果user_file[i][letter]不存在,请简单地使用""代替此行。

真棒,但是下一步是什么?那么现在我们必须把所有东西放在一起。

如果将第一个循环放在循环遍历对象数组的其余部分的循环中,我们可以在那里完成:

for(var i = 1; i < user_file.length; i++) {
    var tmp = {};
    for(var v in user_file[0]) {
      if(user_file[0].hasOwnProperty(v)) {
        tmp[user_file[0][v]] = user_file[i][v] || "";
      }
    }
   a.push(tmp);
}

你有它,一个对象数组,来自晚于第一个元素的对象中的值,使用第一个元素的值作为键,即使后面的元素没有与之对应的值那些钥匙。

答案 1 :(得分:1)

您只能迭代索引1及更高版本中的元素,并将索引为零的对象作为对象的蓝色打印。

var data = [{ A: "Name", B: "Type", C: "Company", D: "Year", E: "Alt1", F: "Name1", G: "Alt2", H: "Name2", I: "Notes" }, { A: "Skittles", C: "Mars", D: 0, E: "Cadbury", F: "Sour Patch Kids", I: "CLEAN" }, { A: "Love", B: "Chocolate", C: "Dove", D: 0, E: "0", F: "0", }],
    keys = Object.keys(data[0]),
    result = data.slice(1).map(function (o) {
        var temp = {};
        keys.forEach(function (k) {
            temp[data[0][k]] = k in o ? o[k] : '';
        });
        return temp;
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

您可以将forEachmap等数组方法与Object.keys结合使用来简化流程。

var array = [
    {
        "A": "Name",
        "B": "Type",
        "C": "Company",
        "D": "Year",
        "E": "Alt1",
        "F": "Name1",
        "G": "Alt2",
        "H": "Name2",
        "I": "Notes"
    },
    {
        "A": "Skittles",
        "C": "Mars",
        "D": 0,
        "E": "Cadbury",
        "F": "Sour Patch Kids",
        "I": "CLEAN"
    },
    {
        "A": "Love",
        "B": "Chocolate",
        "C": "Dove",
        "D": 0,
        "E": "0",
        "F": "0",
    }
]

var master = array.shift()

master = Object.keys(master).map(function (k) { return [k, this[k]] }, master)

array.forEach(function (e) {
  master.forEach(function (pair) {
    var value = pair[0] in e ? e[pair[0]] : defaultValueFor(pair[0])
    delete e[pair[0]]
    e[pair[1]] = value
  })
})

console.log(array)


function defaultValueFor (key) {
  return key === 'Year' ? 0 : ''
}

答案 3 :(得分:1)

以下是完成此操作的一种方法的逐步细分。这确实具有不需要任何三元或if块...

的优点

var user_file = [
    {
        "A": "Name",
        "B": "Type",
        "C": "Company",
        "D": "Year",
        "E": "Alt1",
        "F": "Name1",
        "G": "Alt2",
        "H": "Name2",
        "I": "Notes"
    },
    {
        "A": "Skittles",
        "C": "Mars",
        "D": 0,
        "E": "Cadbury",
        "F": "Sour Patch Kids",
        "I": "CLEAN"
    },
    {
        "A": "Love",
        "B": "Chocolate",
        "C": "Dove",
        "D": 0,
        "E": "0",
        "F": "0",
    }
];
// split off the first set of keys
var keys = user_file[0];
// keep the data separate
var data = user_file.splice(1);
// iterate over the data
var result = data.map(function (item) {
   // item is now one of the last two items
   // get the keys for that item
   var itemKeys = Object.keys(item); 
   // Make a blank
   var newItem = {};
   // iterate over the keys
   itemKeys.forEach(function (key) {
      // get the "real" key name
      var realKey = keys[key]; 
      // set the value of that key to the value of the item
      newItem[realKey] = item[key];
   });
   // add to result
   return newItem;
});
console.log(result);

答案 4 :(得分:1)

这可能是一种更有效的方法,但这是我一起工作的东西。

&#13;
&#13;
var data = [{
  "A": "Name",
  "B": "Type",
  "C": "Company",
  "D": "Year",
  "E": "Alt1",
  "F": "Name1",
  "G": "Alt2",
  "H": "Name2",
  "I": "Notes"
}, {
  "A": "Skittles",
  "C": "Mars",
  "D": 0,
  "E": "Cadbury",
  "F": "Sour Patch Kids",
  "I": "CLEAN"
}, {
  "A": "Love",
  "B": "Chocolate",
  "C": "Dove",
  "D": 0,
  "E": "0",
  "F": "0",
}];

var keyMap = data.shift();
var templateObj = {
  "A": '',
  "B": '',
  "C": '',
  "D": '',
  "E": '',
  "F": '',
  "G": '',
  "H": '',
  "I": '',
};
var results = [];

data.forEach(function(item) {
  var tmpResult = Object.assign({}, templateObj, item);
  var processedItem = {};
  for (var prop in tmpResult) {
    processedItem[keyMap[prop]] = tmpResult[prop];
  }
  results.push(processedItem);
});

console.log(results);
&#13;
&#13;
&#13;