如何在Javascript .map()函数中改变原始数组?

时间:2017-10-02 07:04:50

标签: javascript

例如:

.portlet-titlebar {
  border: 1px solid black;
  min-height: 50px;
}

你想改变"薪水的价值"每个人的原始数组。

9 个答案:

答案 0 :(得分:9)

如果要改变原始数组,可以使用Array#forEach函数。



x = 1:10
y = 10:1

df = data.frame(x, y)

k1vec = FNN::knn.reg(train = df['x'], test = df['x'], y = df$y, k = 1)$pred
k1df = FNN::knn.reg(train = df['x'], test = df['x'], y = df['y'], k = 1)$pred
identical(k1vec, k1df)
[1] TRUE

k2vec = FNN::knn.reg(train = df['x'], test = df['x'], y = df$y, k = 2)$pred
k2df = FNN::knn.reg(train = df['x'], test = df['x'], y = df['y'], k = 2)$pred
`Error in as.matrix(x)[i] : subscript out of bounds`

k3vec = FNN::knn.reg(train = df['x'], test = df['x'], y = df$y, k = 3)$pred
k3df = FNN::knn.reg(train = df['x'], test = df['x'], y = df['y'], k = 3)$pred
identical(k3vec, k3df)
[1] TRUE




Array#map创建一个新创建的项目数组并返回该数组。在您需要分配返回的结果之后。



const persons = [{ "name":"A", "salary":1200 }, { "name":"B", "salary": 1500 }];

persons.forEach(item => item.salary += 1000);

console.log(persons)




答案 1 :(得分:1)

你可以使用一个简单的for循环

var persons = [{ "name":"A", "salary":1200 }, { "name":"B", "salary":"1500" }];

for(let element of persons){
    element.salary*=2;
}

console.log(persons);

答案 2 :(得分:1)

用于每个。如果您的数组中充满了对象,并且您只想对这些对象进行突变(就像在原始问题中一样),则只需让回调函数对在第一个参数中传递给它的项进行突变即可。

如果您的数组中充满了原始元素,那么只能通过向数组插槽分配其他内容来更改数组,从而使数组发生变化,或者如果您出于某些其他原因希望将其重新分配给数组插槽,则仍然可以使用每个。传递给回调的第二个参数和第三个参数是当前正在操作的元素的数组索引,以及对数组本身的引用。因此,在回调函数中,您可以分配给相关的阵列插槽。

答案 3 :(得分:0)



var persons = [{ "name":"A", "salary":1200 }, { "name":"B", "salary":"1500" }];

var mutatedPersons = persons.map(function(obj){
   return {name:obj.name,salary:parseInt(obj.salary) + 100};
})

console.log(mutatedPersons);




答案 4 :(得分:0)

.map()函数在其回调中获取第三个参数,即原始数组的实例。

你也可以这样做:

var persons = [{ "name":"A", "salary":1200 }, { "name":"B", "salary":1500 }];

persons.map(function(person, key, array) {
  array[key].salary *= 2;
});

console.log(persons);

答案 5 :(得分:0)

我阅读了其他答案,您可以使用其中的任何一个,但是我发现那里存在一些问题。

我将提到我已在许多不同语言中使用过的两种方法,分别是mapforEachmap是遍历集合并使用与语言无关的新(不同或相同)元素创建一些新集合的一种实用方法。期望使用map创建一个新集合,该集合由某些mapping从初始集合中创建。另一方面,forEach是一种方法,它通过不对集合使用常规的for循环语法来简化遍历集合的方法,并且可以根据需要更改(或更改)每个项目。

如果在包含对象的集合上使用map,并在mapper函数中更改这些对象,则可能会遇到意外的行为。因为您是直接更改要操作的对象,而不要将其mapping更改为另一个对象。该对象可以视为state,并且计算机根据状态转移来工作。如果您要更改该对象(即某种状态),那绝对可以,但是基于description,在这种情况下您不应该使用map。因为您不是使用新值创建新数组,而是更改提供的元素。在这种情况下,请使用forEach

我添加了一个示例here。您可以单击链接并查看控制台,以更清楚的方式了解我的意思。

据我所知,根据我的经验,map方法中的突变被认为是不好的做法,因此不鼓励使用。

这两个是为了不同的目的而添加的,最好按预期使用它们。

有关更多信息,请参见Mozilla Web Docs page for Array

答案 6 :(得分:0)

JavaScript具有一个内置的Array方法映射,该映射可迭代Array的值

persons.map(person => person["salary"] + 1000)

答案 7 :(得分:0)

尝试:

kali@kali:~$ python badchars.py 
Str = Str + "


▒▒!"#$%&'()*+,-./01"
Str = Str + "23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc"
Str = Str + "defghijklmnopqrstuvwxyz{|}~����������������������"
Str = Str + "some invalid chars"
Str = Str + "��������������������������������������������������"
Str = Str + "������"

答案 8 :(得分:-1)

您可以更改直接通过map迭代的对象。如果我正确理解你的话。

persons.map(i => { i.salary = i.salary * 1.25; return i; });
console.log(persons);
// [{ "name":"A", "salary": 1875 }, { "name":"B", "salary": 2343.75 }]