合并对象后Javascript不需要的“空”属性

时间:2018-02-05 10:01:28

标签: javascript

我想基于属性合并对象,我想使用此属性作为合并数组的键。 这是我的代码:

 let mergedProfiles = [];
  for (let set of profiles) {
      if (Object.keys(mergedProfiles).indexOf(String(set.profile_id)) >= 0) { // if profile id exists
          mergedProfiles[set.profile_id].push(set);
      } else {
          mergedProfiles[set.profile_id] = [];
          mergedProfiles[set.profile_id].push(set);
      }
  }

个人资料对象的示例:{user_id: 17, name: "test", country: "US", bid: 0.02, profile_id: "1", user_id: 12}

合并工作正常但由于某些原因我无法理解我总是以empty作为mergedProfiles中的第一个属性,任何想法是什么?

2 个答案:

答案 0 :(得分:3)

你可以取一个对象而不是一个数组,因为你得到一个没有使用索引的稀疏数组。

$('#txtDate').datepicker(
  {
    onSelect: function(dateText, inst) {
      var tt = document.getElementById('txtDate').value;
      var input = document.getElementById('extdays').value;
      var date = new Date(tt);
      var newdate = new Date(date);

      newdate.setDate(newdate.getDate() + input);

      var dd = newdate.getDate();
      var mm = newdate.getMonth() + 1;
      var y = newdate.getFullYear();

      var someFormattedDate = dd + '/' + mm + '/' + y;
      document.getElementById('follow_Date').value = someFormattedDate;
    }
  }
);
var profiles = [{ user_id: 17, name: "test", country: "US", bid: 0.02, profile_id: "1", user_id: 12 }],
    mergedProfiles = {},
    s;

for (s of profiles) {
    if (!mergedProfiles[s.profile_id]) {
        mergedProfiles[s.profile_id] = [];
    }
    mergedProfiles[s.profile_id].push(s);
}

console.log(mergedProfiles);

答案 1 :(得分:0)

您需要将结果存储在对象中,以便按键引用。

const allProfiles = {};
for(let set of profiles) {
    if(typeof allProfiles[set.profile_id] === "undefined") {
        allProfiles[set.profile_id] = [set];
    }
    else {
        allProfiles[set.profile_id].push(set);
    }
}

您的第一个元素为空的原因是您声明一个空的JavaScript数组,然后无法初始化所有元素。

如果您执行类似

的操作
var someArray = [];
someArray[5] = 10;
console.log(someArray); // [empty × 5, 5]

然后结果是一个稀疏数组,其中前5个元素(0 - 4)都是空的,换句话说是undefined。在您的示例中,您正在执行与上面相同的操作,其中您的profile_id是一个大于0的整数。