【问题标题】:how can I use includes() function on nested arrays?如何在嵌套数组上使用 include() 函数?
【发布时间】:2017-04-20 06:40:47
【问题描述】:

我有一个这样的数组:

var arr = [];
arr = [['red', 685], ['green', 210], ['blue', 65]];

我还有两个变量:

var color  = 'blue';
var number = 21;

我要做的只是检查arr 的每个嵌套数组的第一项,然后更新它的第二项或为其创建一个新数组。

这里有一些例子:

输入:

var color  = 'blue';
var number = 21;

预期输出:

arr = [['red', 685], ['green', 210], ['blue', 21]];

输入:

var color  = 'yellow';
var number = 245;

预期输出:

arr = [['red', 685], ['green', 210], ['blue', 21], ['yellow', 245]];

这是我迄今为止尝试过的:

if ( !arr.includes(color) ) {
    arr.push([color, number]);
} else {
    arr[color] = time;
}

但是!arr.includes(color) 的条件是错误的。因为arr的每一项也是一个数组。无论如何,如何在嵌套数组的第一项上使用includes() 函数?

【问题讨论】:

  • 你只有一层嵌套吗?
  • @Maximus 。 . .是的

标签: javascript jquery arrays


【解决方案1】:

您不能直接在嵌套数组上使用includes,但是,您可以在数组上使用find

arr.find(el => el[0] === color)

这将返回在其他 undefined 中找到的数组元素。返回的值可用于更新数组中的第二个元素。

var arr = [
  ['red', 685],
  ['green', 210],
  ['blue', 65]
];
var color = 'blue';
var number = 21;


function upsert(array, color, number) {
  var exists = arr.find(el => el[0] === color);

  if (exists) {
    exists[1] = number;
  } else {
    arr.push([color, number]);
  }
}

upsert(arr, color, number);
console.log(arr);


var color = 'yellow';
var number = 245;
upsert(arr, color, number);
console.log(arr);

【讨论】:

  • 你的方法看起来不错..但在我自己的例子中实现它有点模糊。
  • @stack 我已经添加了现场演示。
  • 好答案,工作正常。我想知道带有 el[0] 的部分是如何工作的,以及为什么即使它不是父数组中的第一个元素,它仍然可以找到它。
  • @solaire in find el 是父数组中的元素。由于颜色是数组中的第一个元素,所以 el[0] 是指颜色
【解决方案2】:

简单地迭代数组并在找到时更新值,否则推送一个新值

演示

var arr = [['red', 685], ['green', 210], ['blue', 65]];
console.log(updateArray(arr, 'blue', 21));

function updateArray(arr, color, value)
{
  var isFound = false;
  arr = arr.map( function(item){
     if( item[0] == color )
     {
       isFound = true;
       item[1] = value;
     }
     return item;
  });
  if ( !isFound )
  {
    arr.push([color, value]);
  }
  return arr;
}

【讨论】:

    【解决方案3】:

    您应该创建一个循环遍历数组的循环,因为正如您自己指出的那样,数组的每个元素本身就是一个数组。

    如果你这样做:

    for(let i = 0; i < arr.length; i++){
       if ( !arr[i].includes(color) ) {
           arr.push([color, number]);
       } else {
           arr[i][1] = time;
       }
    }
    

    这样,您将检查位置 i 的数组是否具有颜色,如果没有,则将新数组推入数组,否则更改数组 i 的索引 1 处的数组值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多