如何使用JavaScript循环遍历数组中的所有条目?
我以为它是这样的:
forEach(instance in theArray)
Run Code Online (Sandbox Code Playgroud)
theArray我的阵列在哪里,但这似乎是不正确的.
我有一个对象:
myObject = { 'a': 1, 'b': 2, 'c': 3 }
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个本机方法,类似于Array.prototype.map将使用如下:
newObject = myObject.map(function (value, label) {
return value * value;
});
// newObject is now { 'a': 1, 'b': 4, 'c': 9 }
Run Code Online (Sandbox Code Playgroud)
JavaScript是否具有map对象的这种功能?(我想将它用于Node.JS,所以我不关心跨浏览器问题.)
你认为for in和for循环有很大的不同吗?您更喜欢使用什么样的"for"?为什么?
假设我们有一组关联数组:
var myArray = [{'key': 'value'}, {'key': 'value1'}];
Run Code Online (Sandbox Code Playgroud)
所以我们可以迭代:
for (var i = 0; i < myArray.length; i++)
Run Code Online (Sandbox Code Playgroud)
和:
for (var i in myArray)
Run Code Online (Sandbox Code Playgroud)
我没有看到很大的不同.有任何性能问题吗?
当密钥未知时直到运行时,并且当所有键都是相同类型且所有值都是相同类型时,请使用对象上的映射.
当存在对各个元素进行操作的逻辑时使用对象.
在对象上使用地图的适用示例是什么?特别是"什么时候直到运行时才能知道密钥?"
var myMap = new Map();
var keyObj = {},
keyFunc = function () { return 'hey'},
keyString = "a string";
// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");
console.log(myMap.get(keyFunc));
Run Code Online (Sandbox Code Playgroud) data: [],
...
Run Code Online (Sandbox Code Playgroud)
我将 API 调用中的数据加载到data数组中。然后我尝试使用下面的方法将数据数组排列成一个由键、值对(值可以是数组本身)组成的映射。
const dataMap = {};
for (let i = 0; i < data.length; i+=1) {
const key = data[i].product.name;
const value = data[i];
if (key in dataMap) {
dataMap[key].push(value);
} else {
dataMap[key] = [value];
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我执行以下操作时,出现以下错误。我做错了什么?
{[...dataMap].map(([key, value]) => {}
Run Code Online (Sandbox Code Playgroud)
传播不可迭代实例的无效尝试
DataMap 计算正确,但是当我使用以下代码进行迭代时
Object.entries(dataMap).map((key, value) => {
console.log(key);
console.log(value)
})
Run Code Online (Sandbox Code Playgroud)
它打印出以下内容。值是一些我不明白为什么的索引?值应该是一个数组。我的dataMap是一个key,value(值是一个数组)
我最近将一些使用常规对象作为映射的代码转换为新的 es6Map类。我很快就遇到了一个问题,虽然Map该类包含一个forEachlike Array,但它不包含一个some方法以及许多其他Array.prototype方法。
为了提供一些上下文,带有常规 JS 对象的原始代码如下所示:
var map = {
entry1: 'test',
entry2: 'test2'
};
Object.keys(map).some(key => {
var value = map[key];
// Do something...found a match
return true;
});
Run Code Online (Sandbox Code Playgroud)
的Map类不包括一个entries方法,但遗憾的是此返回一个Iterator对象。这也不包括访问这些Array.prototype方法的任何简单方法。
我很好奇是否有一种干净的方法可以做到这一点,或者我是否在咆哮错误的树。
我测试了以下代码:
arr = [3, 5, 7];
arr.foo = "hello";
arr["boo"] ="moo"
for (i in arr) {
console.log(i);
}
for (i of arr) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
for .. in获取数组的所有属性.
for (i in arr) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
收益:
0
1
2
foo
boo
Run Code Online (Sandbox Code Playgroud)
但是因为...没有得到所有的价值观
for (i of arr) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
收益:
3
5
7
Run Code Online (Sandbox Code Playgroud)
这种差异的技术原因是什么?为什么这种明显的不一致性被接受为默认行为?
我正在阅读https://facebook.github.io/react/docs/create-fragment.html文章,发现FB工程师依赖于对象内存布局(属性的顺序):
if (this.props.swapped) {
children = React.addons.createFragment({
right: this.props.rightChildren,
left: this.props.leftChildren
});
} else {
children = React.addons.createFragment({
left: this.props.leftChildren,
right: this.props.rightChildren
});
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么或他们依赖不可靠并提供脆弱的代码?
PS:从ES规范的角度来看问题(我希望它得到回答),而不是一些JS引擎实现的观点(在规范中可能会有变化).
在 Node.js REPL 中:
> var map = new Map();
undefined
> map['foo'] = 'bar';
'bar'
> map['bar'] = 'baz';
'baz'
> map
Map { foo: 'bar', bar: 'baz' }
> map.forEach(console.log);
undefined
Run Code Online (Sandbox Code Playgroud)
如您所见,foo和bar键在 中明确定义map,但是当我尝试使用 迭代它们时Map.prototype.forEach,没有任何反应 - 但根据 MDN,它应该. 还要注意,这Map.prototype.forEach 是定义的,所以不仅仅是这个方法还没有实现。我也尝试过使用for ... of ...循环,结果相同 - 我提供的每次迭代运行的代码实际上并没有运行,即使它应该.
我在 Node.js v4.4.4 上。我在网上搜索了“javascript 地图不是可迭代节点”等内容,但没有成功。
这里发生了什么?
假设我有这个对象:
const millionsOfLines = {
windowsVista: 50,
firefox: 9,
google: 2000,
quake3Engine: 0.3,
mySQL: 12
};
Run Code Online (Sandbox Code Playgroud)
我会以同样的方式为数组做,如果我能做的话:
const lessThan10 = millionsOfLines.filter((value, key)=> value < 10);
Run Code Online (Sandbox Code Playgroud)
相反,我必须这样做:
const lessThan10 = {};
Object.keys(millionsOfLines).forEach(key=>{
if (millionsOfLines[key] < 10) {
lessThan10[key] = value;
}
});
Run Code Online (Sandbox Code Playgroud)
多么麻烦.其他函数肯定也可以与数组版本完全相同的方式工作:
const thousandsOfLines = millionsOfLines.map((value, key)=> value * 1000);
const totalLines = millionsOfLines.reduce((total, currValue, currKey)=> total + currValue);
Run Code Online (Sandbox Code Playgroud)
我计划将其与我实际需要输入的内容进行比较,但我无法承受这种痛苦,所以这是留给读者的练习.
那么 - 为什么javascript对象没有map/reduce/filter?
javascript ×10
ecmascript-6 ×5
arrays ×2
node.js ×2
dictionary ×1
es6-map ×1
facebook ×1
foreach ×1
iteration ×1
loops ×1
map-function ×1
reactjs ×1