假定有一个含若干对象的数组
const arr1 = [
{name:'Tom', grade:'A'},
{name:'Jack',grade: 'E'},
{name:'Mike',grade: 'C'},
{name:'John',grade: 'D'},
{name:'Ben',grade: 'E'},
{name:'Tony',grade: 'D'},
]
想通过比较grade的属性值的异同,动态添加新的属性value,并且value的值为数值型,当grade的属性值不同时(grade的值为任意长度的字符串),分别赋不同的数字值,当grade属性值相同时,赋相同的数字值。
const arr2 = [
{name:'Tom', grade:'A',value: 1},
{name:'Jack',grade: 'E', value: 2},
{name:'Mike',grade: 'C', value: 3},
{name:'John',grade: 'D', value: 4},
{name:'Ben',grade: 'E', value: 2},
{name:'Tony',grade: 'D',value: 4},
]
看看这样符不符合你的需求。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<script>
const arr1 = [
{ name: 'Tom', grade: 'A' },
{ name: 'Jack', grade: 'E' },
{ name: 'Mike', grade: 'C' },
{ name: 'John', grade: 'D' },
{ name: 'Ben', grade: 'E' },
{ name: 'Tony', grade: 'D' },
]
const arr2 = [
{ name: 'Tom', grade: 'A', value: 1 },
{ name: 'Jack', grade: 'E', value: 2 },
{ name: 'Mike', grade: 'C', value: 3 },
{ name: 'John', grade: 'D', value: 4 },
{ name: 'Ben', grade: 'E', value: 2 },
{ name: 'Tony', grade: 'D', value: 4 },
]
function Convert(arr1) {
let cache = {};
let res = JSON.parse(JSON.stringify(arr1))
for (let i = 0; i < res.length; i++) {
let grade = res[i].grade;
if (cache[grade]) res[i].value = cache[grade]
else res[i].value = cache[grade] = Object.keys(cache).length + 1
}
return res;
}
console.log(Convert(arr1));
// 测试是否相等
console.log(JSON.stringify(Convert(arr1)) == JSON.stringify(arr2));
</script>
</body>
</html>
可以使用object记录用到的grade
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
const arr1 = [
{ name: "Tom", grade: "A" },
{ name: "Jack", grade: "E" },
{ name: "Mike", grade: "C" },
{ name: "John", grade: "D" },
{ name: "Ben", grade: "E" },
{ name: "Tony", grade: "D" },
];
let obj = {};
const result = arr1.map((item, index) => {
if (!obj[item.grade]) obj[item.grade] = index + 1;
item.value = obj[item.grade] || index + 1;
return item;
});
console.log("result", result);
</script>
</body>
</html>
<template>
<div id="app">
<HelloWorld v-model="searchText" />
<!-- 等价于 -->
<!-- <HelloWorld
v-bind:value="searchText"
v-on:input="searchText = $event"
></HelloWorld> -->
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App', //父组件
components: {
HelloWorld
},
data(){
return{
searchText:'',
arr1 : [
{ name: "Tom", grade: "A" },
{ name: "Jack", grade: "E" },
{ name: "Mike", grade: "C" },
{ name: "John", grade: "D" },
{ name: "Ben", grade: "E" },
{ name: "Tony", grade: "D" },
]
}
},
created(){
let obj = {};
const result = this.arr1.map((item, index) => {
if (!obj[item.grade]) obj[item.grade] = index + 1
item.value = obj[item.grade]
return item;
});
console.log("result", result);
},
methods:{
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>