我想知道是否有办法在 JavaScript 中执行类似 PHP foreach
循环的操作。我正在寻找的功能类似于这个 PHP Snippet:
foreach($data as $key => $value) { }
我正在查看 JS for..in
循环,但似乎无法指定 as
。如果我使用“正常”for循环(for(var i = 0; i < data.length; i++
)执行此操作,有没有办法抓住关键=>价值对?
for (var k in target){
if (target.hasOwnProperty(k)) {
alert("Key is " + k + ", value is " + target[k]);
}
}
hasOwnProperty
用于检查您的 target
是否真的具有该属性,而不是从其原型继承它。更简单的是:
for (var k in target){
if (typeof target[k] !== 'function') {
alert("Key is " + k + ", value is" + target[k]);
}
}
它只是检查 k
不是方法(就像 target
是 array
一样,您会收到很多方法警报,例如 indexOf
、push
、pop
等)
如果您可以本机使用 ES6 或与 Babel(js 编译器)一起使用,那么您可以执行以下操作:
常量测试 = {a: 1, b: 2, c: 3}; for (const [key, value] of Object.entries(test)) { console.log(key, value); }
这将打印出这个输出:
a 1
b 2
c 3
Object.entries()
方法返回给定对象自己的可枚举属性 [key, value]
对的数组,其顺序与 for...in
循环 提供的顺序相同(不同之处在于 for-in 循环枚举原型链中的属性)。
Object.entries 文档
对于...的文档
解构分配文档
属性文档的可枚举性和所有权
Object.entries
调用而变慢。虽然我没有进行任何测试。
没有人提到 Object.keys
,所以我会提到它。
Object.keys(obj).forEach(function (key) {
// do something with obj[key]
});
for of
tc39wiki.calculist.org/es6/for-of
for...in 将为您工作。
for( var key in obj ) {
var value = obj[key];
}
在现代 JavaScript 中,你也可以这样做:
for ( const [key,value] of Object.entries( obj ) ) {
}
var obj = {...};
for (var key in obj) {
var value = obj[key];
}
php 语法只是糖。
我假设您知道 i
是键,并且您可以通过 data[i]
获取值(并且只想要一个快捷方式)。
ECMAScript5 为数组引入了 forEach
[MDN](看起来你有一个数组):
data.forEach(function(value, index) {
});
MDN 文档为不支持它的浏览器提供了一个 shim。
当然这对对象不起作用,但你可以为它们创建一个类似的函数:
function forEach(object, callback) {
for(var prop in object) {
if(object.hasOwnProperty(prop)) {
callback(prop, object[prop]);
}
}
}
由于您使用 jquery 标记了问题,因此 jQuery 提供了 $.each
[docs] 循环遍历数组和对象结构。
forEach
,而不是对象 forEach
。
for each
语法的非标准扩展。 for each (let val in myObj) console.log(val);
。
为此,您可以使用 for..in
。
for (var key in data)
{
var value = data[key];
}
for (var key in myMap) {
if (myMap.hasOwnProperty(key)) {
console.log("key =" + key);
console.log("value =" + myMap[key]);
}
}
在 javascript 中,每个对象都有一堆具有元信息的内置键值对。当您遍历对象的所有键值对时,您也在遍历它们。使用 hasOwnProperty() 过滤掉这些。
有三个选项可以处理对象的键和值:
选择值: Object.values(obj).forEach(value => ...);选择键: Object.keys(obj).forEach(key => ...);选择键和值: Object.entries(obj).forEach(([key, value]) => ...);
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))
// a 1
// b 2
// c 3
[['a', 1],['b',2],['c',3]]
。 forEach
解构每个键/值数组并将两个变量设置为 key
和 value
,以便在 in 函数中使用 - 这里是 console.log
中的输出。
在提出这个问题后的最后几年里,Javascript 增加了一些新特性。其中之一是 Object.Entries 方法。
直接从MDN复制的是以下代码片段
const object1 = {
a: 'somestring',
b: 42
};
for (let [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
ES6 将提供 Map.prototype.forEach(callback) 可以像这样使用
myMap.forEach(function(value, key, myMap) {
// Do something
});
myMap
是干什么用的?
您可以为此使用“for in”循环:
for (var key in bar) {
var value = bar[key];
}
下面是一个尽可能接近的示例。
for(var key in data){
var value = data[key];
//your processing here
}
如果您使用 jQuery,请参阅:http://api.jquery.com/jQuery.each/
如果您使用 Lodash,则可以使用 _.forEach
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).
为什么不简单地这个
var donuts = [
{ type: "Jelly", cost: 1.22 },
{ type: "Chocolate", cost: 2.45 },
{ type: "Cider", cost: 1.59 },
{ type: "Boston Cream", cost: 5.99 }];
donuts.forEach(v => {console.log(v["type"]+ " donuts cost $"+v["cost"]+" each")});
请尝试以下代码:
<script>
const games = {
"Fifa": "232",
"Minecraft": "476",
"Call of Duty": "182"
};
Object.keys(games).forEach((item, index, array) => {
var msg = item+' '+games[item];
console.log(msg);
});
array
?与 5 年前的相同建议相比,您的回答有何价值?
是的,您也可以在 javascript 中使用关联数组:
var obj =
{
name:'some name',
otherProperty:'prop value',
date: new Date()
};
for(i in obj)
{
var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}
var global = (function() {
return this;
})();
// Pair object, similar to Python
function Pair(key, value) {
this.key = key;
this.value = value;
this.toString = function() {
return "(" + key + ", " + value + ")";
};
}
/**
* as function
* @param {String} dataName A String holding the name of your pairs list.
* @return {Array:Pair} The data list filled
* with all pair objects.
*/
Object.prototype.as = function(dataName) {
var value, key, data;
global[dataName] = data = [];
for (key in this) {
if (this.hasOwnProperty(key)) {
value = this[key];
(function() {
var k = key,
v = value;
data.push(new Pair(k, v));
})();
}
}
return data;
};
var d = {
'one': 1,
'two': 2
};
// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
key = data[i].key;
value = data[i].value;
console.log("key: " + key + ", value: " + value);
}
// delete data when u've finished with it.
delete data;
不定期副业成功案例分享
Object.keys
。Object.keys(target).forEach(function (key) { target[key]; });
。Object.create(null)
创建target
将无法工作,应更改代码target.hasOwnProperty(k)
->Object.prototype.hasOwnProperty.call(target,k)
k
、target
和property
是什么?对我来说,非javascripter这个未定义的领域:)obj.hasOwnProperty(k)
时,它都应该被重写为Object.prototype.hasOwnProperty.call(obj, k)
。如果您不知道一个对象是否有自己的属性k
,那么您可能也不知道肯定它是否有一个名为"hasOwnProperty"
的自己的属性;如果是这样,你不想要那个,你想要来自Object.prototype
的那个。因此,IMO 将hasOwnProperty
作为一种方法根本就是语言的设计缺陷;没有人希望它的行为在实践中被覆盖。