处理Array.map中的上一个项目?

时间:2018-09-19 06:47:41

标签: javascript arrays

我正在用Array.prototype.map()转换数组,如果当前项目符合某些条件,我想更改其上一个项目。

下面的代码似乎无法正常工作,如何在没有for循环的情况下进行操作?

var nums = [1, 2, 3, 4, 5];

var res = nums.map((item, index, array) => {
  if (item > 3) {
    array[index - 1] += 1;
  }
  return item;
});

console.log(res); // [ 1, 2, 3, 4, 5 ], I want [1, 2, 4, 5, 5]

5 个答案:

答案 0 :(得分:1)

不能像这样引用从.map创建的数组。相反,请创建forEach的数组外部,然后将其推入/分配给它:

var nums = [1, 2, 3, 4, 5];
const newArr = [];
nums.forEach((item, index) => {
  if (item > 3) newArr[index - 1] += 1;
  newArr.push(item);
});

console.log(newArr); // I want [1, 2, 4, 5, 5]

答案 1 :(得分:1)

您可以使用减速器

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val pref = this.getSharedPreferences("myPrefs", Context.MODE_PRIVATE)

    if (!pref.getString("login", "").isEmpty()) {
        portText.setText(pref.getString("login", ""))
    }


    loginButton.setOnClickListener {
        val login = portText.text.toString()
        pref.edit().putString("login", login).apply()
        startActivity(Intent(this, SecondActivity::class.java))
    }

}

答案 2 :(得分:1)

免责声明:之所以只提供此答案,是因为我觉得有人问“如何在不使用for循环的情况下执行X”,我觉得所有地图之间至少应该有一个 递归解决方案。减少:)

  

在没有for循环的情况下该怎么办?

如果您对性能或堆栈崩溃风险不太在意,则可以使用递归函数!

这是一个例子:

  • 将数组分解为firstsecond和其余的
  • 如果first为空,则说明计算已经结束并返回结果
  • 如果first不为空,我们可以将其与second进行比较以确定其值。我们将值添加到结果中并递归:
  • 再次调用该函数,但现在使用[second, ...rest]并传递结果

const input = [ 1, 2, 3, 4, 5 ];
const Empty = Symbol();

const incIfBt3 = 
  ([first = Empty, second, ...rest], result = []) =>
    first === Empty
      ? result
      : incIfBt3(
          [second, ...rest],
          [...result, first + (second > 3)]
        );
        
        
console.log(incIfBt3(input));

答案 3 :(得分:0)

您可以向前看而不是向后看:

var nums = [1, 2, 3, 4, 5];

var res = nums.map((item, index, array) => {
  if (array[index + 1] > 3) {
    item += 1;
  }
  return item;
});

答案 4 :(得分:0)

您可以使用array参数查看 next 项并为返回一个值,而不是尝试更改上一个项>相应的当前项目:

var nums = [1, 2, 3, 4, 5];

var res = nums.map((item, index, array) => item + (array[index + 1] > 3 ? 1 : 0));

console.log(res); // [1, 2, 4, 5, 5]

您还可以利用布尔值的数字值为1或0来消除条件表达式的事实:

var nums = [1, 2, 3, 4, 5];

var res = nums.map((item, index, array) => item + (array[index + 1] > 3));

console.log(res); // [1, 2, 4, 5, 5]