我有一大堆对象,我需要获取某些键的唯一值。 我有代码工作,但我想了解它。
对象
{
"cor": {
"id": 89,
"code": "192"
},
"tamanho": {
"id": 74,
"code": "L"
},
"price": "56,34",
"prevPrice": "93,90",
"stock": 0
}
这是仅返回唯一值的迭代。 我无法理解的是return语句,javasacript如何读取它?
var tamanhos = [];
data.grelha.filter(function(el, i, arr) {
return tamanhos.indexOf(el.tamanho.id) == -1 && tamanhos.push(el.tamanho.id);
});
非常感谢!
答案 0 :(得分:2)
在我达到你想要的之前,我们先谈谈.filter()
。首先,它返回一个新数组,因此调用.filter()
而不使用它的返回值不是你应该如何使用它:如果你只想迭代数组,你应该使用.forEach()
。它通过调用每个数组元素传递一次的函数来工作。只有函数返回truthy值的元素才会被添加到输出数组中。 正确使用.filter()
解决此问题的方法是这样的:
var tamanhos = data.grelha.map(el) { return el.tamaho.id }).filter(function(el, i, arr) {
return arr.indexOf(el) === i
})
也就是说,首先使用.map()
获取所有ID的列表,然后使用.filter()
仅保留元素(如果它们是第一个出现的ID)数组,因此将tamanhos
设置为唯一ID数组。
现在你要问的是什么,这是为了解释下面一行的内容:
return tamanhos.indexOf(el.tamanho.id) == -1 && tamanhos.push(el.tamanho.id);
关键是&&
(logical AND) operator。它使用short circuit evaluation,这意味着只有左侧的表达式是真实的,才会评估&&
右侧的表达式。
两个简单的例子(点击“运行”):
true && alert('This WILL display because alert() is called.');
false && alert('This will NOT display because alert() is not called');
因此,如果tamanhos.indexOf(el.tamanho.id) == -1
为真,那么tamanhos.push(el.tamanho.id)
部分将被执行,否则.push()
将不执行。换句话说,return
之后的部分相当于这样做:
if (tamanhos.indexOf(el.tamanho.id) == -1) {
tamanhos.push(el.tamanho.id);
}
(也就是说,如果该项目不在tamanhos
数组中,则添加它。)
然后返回整个&&
表达式的结果,但如上所述,这不是真正相关的,因为您不使用.filter()
的返回值。所以你的代码正在做的就是这个:
var tamanhos = [];
data.grelha.forEach(function(el) {
if (tamanhos.indexOf(el.tamanho.id) == -1) {
tamanhos.push(el.tamanho.id);
}
});
答案 1 :(得分:0)
这是一个json数据。 Json值可以使用数组。我想,你知道阵列。因此Arrays有多个领域。喜欢 :
[val1]
[val1, val2]
[val1, val2, val3]
[val1, val2, val3, .....]
我们可以将值作为列名。 c#的示例:
array[] names = new array["mesut", "joa"]
你有javascript数组