在$ .each循环中,获取两种不同类型的对象会返回值并且未定义

时间:2017-02-05 23:28:19

标签: javascript jquery loops local-storage

我有一个localStorage,它可以动态创建密钥。它们基本上存储'name''age',每种情况都有不同的前缀。区分我正在使用endsWith()方法。

我有一个函数,它会将.append的数据用于元素。问题在于,在调用函数的时刻,由于结果未定义,我无法使其工作:

// below I'm faking result of localStorage
var fakeStorage = {
  'aaa-name': 'John',
  'aaa-age': 20,
  'bbb-name': 'Robert',
  'bbb-age': 45,
  'ccc-name': 'James',
  'bbb-age': 30,
  'somethingUneeded': 'cars',
  'anotherSomethingUneeded': 'money'
}

$.each(fakeStorage, function (key, value) {
  if (!key.endsWith('name') && !key.endsWith('age')) {
      return
  }
  var name
  var age
  if (key.endsWith('name')) {
    name = value
  } else {
    // get results of "age"
    age = value
  }
  console.log(name)
  // returns: 
  // John
  // undefined
  // Robert
  // undefined
  // James
  // undefined

  console.log(age)
  // returns: 
  // 20
  // undefined
  // 45
  // undefined
  // 30
  // undefined

  // Here's the function I need for the sake of undertanding.
  // with the above output I can't call it due to undefined
  // functionToAppendBoth(name, age)
})

我如何处理该代码,以便跳过“未定义”值?我使用当前结果编写了一个CodePen:http://codepen.io/anon/pen/ZLRjNg?editors=1010

1 个答案:

答案 0 :(得分:1)

您可以创建一个新的对象,并为其分配以后可以轻松使用的值,

我可以想到结构如:

{
  name: [],
  age: []
}

示例代码段:



// below I'm faking result of localStorage
var fakeStorage = {
  'aaa-name': 'John',
  'aaa-age': 20,
  'bbb-name': 'Robert',
  'bbb-age': 45,
  'ccc-name': 'James',
  'bbb-age': 30,
  'somethingUneeded': 'cars',
  'anotherSomethingUneeded': 'money'
}
var tempObj = {
  name: [],
  age: []
};
$.each(fakeStorage, function(key, value) {
  if (!key.endsWith('name') && !key.endsWith('age')) {
    return
  }
  if (key.endsWith('name')) {
    tempObj.name.push(value)
  } else {
    tempObj.age.push(value)
  }
});
console.log(tempObj);

$.each(tempObj.name, function(index) {
  console.log(tempObj.name[index] + ' ' + tempObj.age[index]);
})

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

或者我们可以进行状况检查,看看我们是否有姓名和年龄。

示例代码段:

&#13;
&#13;
// below I'm faking result of localStorage
var fakeStorage = {
  'aaa-name': 'John',
  'aaa-age': 20,
  'bbb-name': 'Robert',
  'bbb-age': 45,
  'ccc-name': 'James',
  'bbb-age': 30,
  'somethingUneeded': 'cars',
  'anotherSomethingUneeded': 'money'
}
var tempObj = {
  name: '',
  age: ''
};
$.each(fakeStorage, function(key, value) {
  if (!key.endsWith('name') && !key.endsWith('age')) {
    return
  }
  if (key.endsWith('name')) {
    tempObj.name = value
  } else {
    tempObj.age = value
  }
  if (tempObj.name && tempObj.age) {
    console.log(tempObj.name + ' ' + tempObj.age);
    //call desired function here;
    tempObj = {
      name: '',
      age: ''
    };
  }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;