Javascript返回语句里面的过滤函数,得到唯一的。为什么代码有效?

时间:2017-03-30 09:42:38

标签: javascript arrays object filter unique

我有一大堆对象,我需要获取某些键的唯一值。 我有代码工作,但我想了解它。

对象

{
"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);
});

非常感谢!

2 个答案:

答案 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数组